开发者

How to get a diagonal matrix from A vector

开发者 https://www.devze.com 2023-02-15 13:40 出处:网络
I have a column: 0.0677 0.0584 0.0487 0.0453 0.0394 开发者_如何学GoWhat instruction would get the following output

I have a column:

0.0677
0.0584
0.0487
0.0453
0.0394
开发者_如何学Go

What instruction would get the following output

0.0677   0          0         0          0
0        0.0584     0         0          0
0        0          0.0487    0          0
0        0          0         0.0453     0
0        0          0         0          0.0394


diag is the normal MATLAB solution (as pointed out by posdef.) Thus

D = diag(vec);

gives you a matrix with diagonal elements as needed.

Perhaps better in some applications is to create a sparse matrix, since a diagonal matrix is quite sparse. So if you are doing matrix multiplies this will greatly help in reducing the number of unnecessary operations.

n = length(vec);
D = spdiags(vec(:),0,n,n);

If you truly wanted to do the assignment in an explicit form, use a single linear index like this:

n = length(vec);
D = zeros(n);
D(cumsum([1,repmat(n+1,1,n-1)])) = vec;

Or you could use the sub2ind function to convert a set of indices into a single index.


If I remember correctly there's a command called something like diag(A)

Edit: here you go, some documentation on the diag http://www.mathworks.com/help/techdoc/ref/diag.html

pay particular attention to the quote:

X = diag(v) puts v on the main diagonal, same as above with k = 0.


The following gives the diagonal matrix D whose diagonal is the vector vec. It is written in a vectorized fashion in MATLAB.

D      = zeros(numel(vec));
[I,J]  = ind2sub(size(D),1:numel(D));
ind    = [I(:) J(:)];
ind    = find(ind(:,1)==ind(:,2));
D(ind) = vec;


Well, obviously you can do it in a C-like way. Right now I can't figure out more elegant solution.

vector;%Your vector
vec_length = length(vector);
A = zeros(vec_length);
for i=1:vec_length
   A(i,i)  = vector(i);
end;
0

精彩评论

暂无评论...
验证码 换一张
取 消