標籤:

matlab矩陣對角元元素修改問題?

matlab中,有啥語句只對矩陣中的對角元元素進行修改,形如,A=[1,2,3,4;5,6,7,8;9,10,11,12;13,14,15,16];怎樣將對角元元素全改成10,我試過for循環,形如:for i=1:4;A(i,i)=10;end 。為什麼連非對角元素也改變了?求解,或者有啥可以不用for循環的語句來表示啊。求大神回答。


這是一個反應「不適當地向量化或過度向量化」會使得問題更糟糕的一個例子:

function diagTest
a = rand(5000); % 如果內存小可以適當減小a的size
b = a; b(1) = b(1); % 強制產生拷貝
c = a; c(1) = c(1);
d = a; d(1) = d(1);
e = a; e(1) = e(1);
tic % 循環
n = size(a,1);
for i = 1:n
a(i,i) = 10;
end
toc
tic % 根據線性索引將上述循環向量化
b(1:size(b,1)+1:end) = 10;
toc
tic % "高級方法1"
c = c + diag(10-diag(c));
toc
tic % "高級方法2"
d(eye(size(d))==1) = 10;
toc
tic % 改進的"高級方法2"
e(logical(speye(size(e)))) = 10;
toc
isequal(a,b,c,d,e) % 驗證結果相同

放在m文件中多次執行後,最後一次運行結果如下:

Elapsed time is 0.000154 seconds.
Elapsed time is 0.000159 seconds.
Elapsed time is 0.055256 seconds.
Elapsed time is 0.084461 seconds.
Elapsed time is 0.000331 seconds.
ans =
1


A(eye(n)==1)=vector

eg:

A(eye(4)==1)=10


循環的寫法是對的。這也是我推薦的寫法。

另外有一些更簡潔但更晦澀的寫法,詳見How to assign values on the diagonal?。


A(1:5:end)=10;


A1 = A - diag(diag(A)) + diag(10*ones(n));


for i=1:4

A(i,i)=10

end


推薦閱讀:

幾億的數據讀取作圖怎樣做到速度快呢?
用matlab實現樂曲演奏的難度?在網上聽到一首用matlab編寫的卡農,求分析一下實現及難度所在?
Matlab啟動後,current folder顯示processing,然後就很卡,不能用了怎麼辦?
matlab如何很好的處理比較大的數據?
如何用matlab編寫人拔禾苗,禾苗變高的這一系列動作?

TAG:MATLAB |