2012-11-23 51 views
4

我仍然在學習MATLAB中的一些高級功能。如何在MATLAB中求和所有其他行

我有一個二維矩陣,我想總結所有行,除了我。

1 1 1 
2 2 2 
4 4 4 

說我= 2,我想這一點:

5 5 5 

我可以通過所有行相加,然後減去行我做,但我想知道如果使用MATLAB的索引/選擇語法有更快的方法。

回答

3

嗯,你可以做這樣的:

>> A = [ 1 1 1 
     2 2 2 
     4 4 4]; 
>> n = 2; 
>> sum(A([1:n-1 n+1:end], :)) 
ans = 
    5 5 5 

然而,正如奈特已經表示,因爲漂亮,因爲它可能看起來,它實際上不僅僅是減去單行,我建議不要這麼慢得多使用它:)

+0

是它的確是更快? '總和(A)-A(n,:)'在我的機器上快得多...... – bla

+1

@nate:是的,看起來你是對的。我會編輯它。 –

+0

@nate:嗯......現在爲什麼它會* SO *慢得多?這是一個數量級,即使你放棄創建索引... –

7

看來,所有行相加,再扣除我行,是要快得多強硬:

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. 
+1

你有一臺相當快的電腦,nate。你在用什麼?我有一個2.8GHz的i7,結果比你慢4倍......這讓我很擔心:) – angainor

4

要添加到前人的性能方面的考慮。 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. 
相關問題