我有一栏:
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
答案 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;