2015-09-07 98 views
2

我有大小1 x 5的向量v和大小5 x 5的对角矩阵D。在我的例子,我有v = [0 1 2 3 4].从矢量生成对角矩阵的简单方法?

第一个问题:我希望把对角的D矢量V,使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 

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

任何帮助将不胜感激!

回答

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

我没有手头MATLAB的权利,但我会使用以下功能组合: - 诊断 - 眼 - 逻辑

等效的问题是在这里找到答案: How to assign values on the diagonal?

+0

好的,谢谢ANW的回答:) – Christina

+1

没有概率。如果我有时间回家,我会给它拍摄:) – George