我仍然在學習MATLAB中的一些高級功能。如何在MATLAB中求和所有其他行
我有一個二維矩陣,我想總結所有行,除了我。
如
1 1 1
2 2 2
4 4 4
說我= 2,我想這一點:
5 5 5
我可以通過所有行相加,然後減去行我做,但我想知道如果使用MATLAB的索引/選擇語法有更快的方法。
我仍然在學習MATLAB中的一些高級功能。如何在MATLAB中求和所有其他行
我有一個二維矩陣,我想總結所有行,除了我。
如
1 1 1
2 2 2
4 4 4
說我= 2,我想這一點:
5 5 5
我可以通過所有行相加,然後減去行我做,但我想知道如果使用MATLAB的索引/選擇語法有更快的方法。
嗯,你可以做這樣的:
>> A = [ 1 1 1
2 2 2
4 4 4];
>> n = 2;
>> sum(A([1:n-1 n+1:end], :))
ans =
5 5 5
然而,正如奈特已經表示,因爲漂亮,因爲它可能看起來,它實際上不僅僅是減去單行,我建議不要這麼慢得多使用它:)
看來,所有行相加,再扣除我行,是要快得多強硬:
A=rand(500);
n = randi(500);
tic
for i=1:1e3
%sum(A([1:n-1 n+1:end], :));
sum(A)-A(n,:);
end
toc
Elapsed time is 0.162987 seconds.
A=rand(500);
n = randi(500);
tic
for i=1:1e3
sum(A([1:n-1 n+1:end], :));
end
toc
Elapsed time is 1.386113 seconds.
你有一臺相當快的電腦,nate。你在用什麼?我有一個2.8GHz的i7,結果比你慢4倍......這讓我很擔心:) – angainor
要添加到前人的性能方面的考慮。 nate解決方案速度更快,因爲它不使用第二種方法的複雜矩陣索引。複雜的矩陣/矢量索引is very inefficient in MATLAB。我懷疑這與索引相同的問題與引用問題中描述的相同。
考慮下面的簡單測試,繼先前的框架:
A=rand(500);
n = randi(500);
tic
for i=1:1e3
B=sum(A(:, :));
end
toc
Elapsed time is 0.747704 seconds.
tic
for i=1:1e3
B=sum(A(1:end, :));
end
toc
Elapsed time is 5.476109 seconds. % What ???!!!
tic
id = [1:n-1 n+1:500];
for i=1:1e3
B=sum(A(id, :));
end
toc
Elapsed time is 5.449064 seconds.
是它的確是更快? '總和(A)-A(n,:)'在我的機器上快得多...... – bla
@nate:是的,看起來你是對的。我會編輯它。 –
@nate:嗯......現在爲什麼它會* SO *慢得多?這是一個數量級,即使你放棄創建索引... –