从向量生成对角矩阵的简单方法?

Easy way to generate a diagonal matrix from a vector?

我有一个大小为 1 x 5 的向量 v 和一个大小为 5 x 5 的对角矩阵 D。在我的示例中,我有 v = [0 1 2 3 4].

第一个问题:我想把向量v放在D的对角线上,这样D(1,1) = 0,D(2,2) = 1,D(3,3) = 2D(4,4) = 3D(5,5) = 4.

我为此编写了一个 matlab 代码,但我确信还有另一种计算成本低得多的自动方法。 所以我写的(并向你优化)如下:

    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 

第二题:完成第一题后,我现在需要检查D的对角线值是否为零。如果我可以(以自动方式)找到 D 的对角线上的值等于零,则将其替换为 0.001.

其实这个可以有很多种写法,比如:

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

但我需要另一种在计算方面非常便宜的自动方法。

非常感谢任何帮助!

你让你的生活比必要的更艰难:你不需要两个循环(一个就足够了),因为你只需要沿着对角线走。 你实际上不需要任何循环,在这里;只有 diag 函数。

无论如何,在 v 的副本中替换零条目可能更容易,然后用它来构建对角矩阵:

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

注意:如果您要替换的条目不完全为零,而是小的浮点值,您需要这样的东西:

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

其中 epsilon 是阈值,低于该阈值,就您而言,条目非常接近于零,可以忽略不计。


那么,由于你写的D已经是对角矩阵了,你可以简单地覆盖它:

D = diag(v2);

我现在手头没有 matlab,但我会结合使用以下函数: - 诊断 - 眼睛 - 逻辑

这里回答了一个相同的问题: How to assign values on the diagonal?