从矢量生成对角矩阵的简便方法?

Chr*_*ina 2 matlab matlab-guide

我有一个向量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) = 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 
Run Code Online (Sandbox Code Playgroud)

第二个问题:在完成第一个问题之后,我现在需要检查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
Run Code Online (Sandbox Code Playgroud)

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

任何帮助将非常感谢!

jub*_*0bs 5

你的生活比必要的要艰苦:你不需要两个循环(一个就够了),因为你只需沿着对角线走路.你实际上不需要任何循环,这里; 只有diag功能.

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

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

注意:如果要替换的条目不完全为零,而是小的浮点值,则需要使用以下内容:

v2(abs(v2) < epsilon) = 1e-3;  % replace zero entries
Run Code Online (Sandbox Code Playgroud)

epsilon阈值在哪里,就您而言,该条目足够接近于零,可以忽略不计.


然后,既然你D已经写了一个对角矩阵,你可以简单地覆盖它:

D = diag(v2);
Run Code Online (Sandbox Code Playgroud)