我有一个大小为v
的向量1 x 5
,以及一个大小为D
的对角矩阵5 x 5
。在我的示例中,我有v = [0 1 2 3 4].
第一个问题:我想将矢量v放在D
的对角线上,以便D(1,1) = 0
,D(2,2) = 1
,D(3,3) = 2
, D(4,4) = 3
和D(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
但是我需要另一种在计算方面非常便宜的自动方法。
非常感谢任何帮助!
答案 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?