# matlab - Easy way to generate a diagonal matrix from a vector?

I have a vector v of size 1 x 5, and a diagonal matrix D of size 5 x 5. In my example, I have v = [0 1 2 3 4].

First question: I want to put the vector v on the diagonal of D, so that D(1,1) = 0, D(2,2) = 1, D(3,3) = 2, D(4,4) = 3 and D(5,5) = 4.

I wrote a matlab code for this but I am sure that there is another automatic method much less expensive in computation.

So what I wrote (and to be optimized from you) is the following:

ii = 1;

for a = 1 : size(D,1)

for b = 1 : size(D,2)

if(a == b)

D(a,b) = v(1, ii);

ii = ii + 1;

end

end

end

Second Question: After finishing the first question, I need now to check if the diagonal values of D are equal to zero. If I can find (in an automatic way) a value on the diagonal of D is equal to zero, so replace it by 0.001.

In fact this can be written in a lot of manners, for example:

for a = 1 : size(D,1)

for b = 1 : size(D,2)

if(a == b)

if(D(a,b) == 0)

D(a,b) = 0.001;

end

end

end

end

But I need another automatic method which can be very cheap in terms of computations.

Any help will be very appreciated!

You're making your life harder than necessary: you don't need two loops (one would be enough), since you only need to walk along the diagonal. You actually don't need any loop, here; only the diag function.

Anyway, it may be easier to replace zero entries in a copy of v, and then use it to build the diagonal matrix:

v2 = v;              % create a copy of v (if needed)
v2(v2 == 0) = 1e-3;  % replace zero entries

Note: If the entries you want to replace are not exactly zero, but small floating-point values, you'll need something like this instead:

v2(abs(v2) < epsilon) = 1e-3;  % replace zero entries

where epsilon is the threshold below which, as far as you're concerned, the entry is close enough to zero that it can be neglected.

Then, since you write that D already is a diagonal matrix, you can simply overwrite it:

D = diag(v2);

I don't have matlab on-hand right now, but I'd use a combination of the following functions: - diag - eye - logical

An equivalent question was answered here: How to assign values on the diagonal?