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

时间:2015-09-07 12:50:48

标签: matlab matlab-guide

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

第一个问题:我想将矢量v放在D的对角线上,以便D(1,1) = 0D(2,2) = 1D(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

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

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:5)

你的生活比必要的更难:你不需要两个循环(一个就足够了),因为你只需沿着对角线走路。 你实际上不需要任何循环,这里;只有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);

答案 1 :(得分:1)

我现在没有matlab,但我使用了以下功能的组合: - 诊断 - 眼睛 - 逻辑

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