2015-09-07 95 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