如何从A向量得到对角矩阵

时间:2011-03-09 09:44:04

标签: matlab

我有一栏:

0.0677
0.0584
0.0487
0.0453
0.0394

将获得以下输出的指令

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

4 个答案:

答案 0 :(得分:25)

diag是正常的MATLAB解决方案(正如posdef所指出的那样)。因此

D = diag(vec);

根据需要为您提供带对角元素的矩阵。

在某些应用中可能更好的是创建稀疏矩阵,因为对角矩阵非常稀疏。因此,如果您正在进行矩阵乘法运算,这将极大地减少不必要的操作次数。

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

如果您真的想以显式形式进行分配,请使用单个线性索引,如下所示:

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

或者您可以使用sub2ind函数将一组索引转换为单个索引。

答案 1 :(得分:13)

如果我没记错,有一个名为diag(A)

的命令

编辑:你去了diag的一些文档 http://www.mathworks.com/help/techdoc/ref/diag.html

特别注意引用:

  

X = diag(v)将v放在主对角线上,与上面相同,k = 0。

答案 2 :(得分:3)

以下给出了对角矩阵D,其对角线是向量vec。它以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;

答案 3 :(得分:1)

嗯,显然你可以用类似C的方式做到这一点。现在我无法找到更优雅的解决方案。

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