2012-11-23 7 views
4

아직 MATLAB의 고급 기능을 배우고 있습니다.MATLAB의 다른 모든 행을 합계하는 방법

저는 2D 행렬을 가지고 있고 i를 제외하고 모든 행을 합산하려고합니다. 예를 들어

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

입니까? 'sum (A) -A (n, :)'는 내 컴퓨터에서 훨씬 빠릅니다. – bla

+1

@nate : 예, 맞습니다. 나는 그것을 편집 할 것입니다. –

+0

@nate : hmmm ... 이제 왜 그렇게 될까요? * 훨씬 느립니다. 인덱스의 생성을 해제하더라도 ... –

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

당신은 꽤 빠른 컴퓨터를 가지고 있습니다. 뭐라구? 나는 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. 
관련 문제