从向量生成对角矩阵的简单方法?
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) = 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
但我需要另一种在计算方面非常便宜的自动方法。
非常感谢任何帮助!
你让你的生活比必要的更艰难:你不需要两个循环(一个就足够了),因为你只需要沿着对角线走。
你实际上不需要任何循环,在这里;只有 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?
我有一个大小为 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) = 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
但我需要另一种在计算方面非常便宜的自动方法。
非常感谢任何帮助!
你让你的生活比必要的更艰难:你不需要两个循环(一个就足够了),因为你只需要沿着对角线走。
你实际上不需要任何循环,在这里;只有 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?