2014-12-20 1 views
1

a 저장 1,000 X 행 500 열의 매트릭스를 갖는다. 또한 1500 사이의 범위에서 1,000 정수 l의 벡터를 가지고있다. 모든 i에 대해 a(i,l(i))의 합계를 계산하려고합니다. for 루프를 사용하지 않고도 빠르게 수행 할 수 있습니까?vectorising 추상 행 조회

답변

3

당신 요소 합산하고 스칼라 합산 값을 발견 할 수있는 요소의 선형 지수를 계산할 수있다. 그래서,이 꽤 효율적으로해야 -

nrows = size(a,1) %// number of rows in input matrix a 
idx = (l(:)-1)*nrows + [1:nrows]' %//'# linear indices of elements to be summed up 
             %// OR idx = sub2ind(size(a),[1:nrows]',l(:)) 
sumval = sum(a(idx)) %// index into a and get the sum value 
+0

니스! 나는 이것이'sub2ind'보다 더 빠를 것이라고 생각합니다. +1. – rayryeng

+0

@rayryeng 이봐! :) 그래, http://stackoverflow.com/questions/25528685/filter-matrix-rows-depending-on-values-in-a-second-matrix/25530905# ([이되어야한다] 25530905). 실제로 내가 과거에 쓴 많은 코드에 대한 sub2ind''대신이를 사용했습니다 – Divakar

+0

니스 :) ... 난 그냥이 점에 대해 최대 잊어 버렸습니다. – rayryeng

2

을 내가 제안 할 수 있습니다 또 다른 방법은 모든 값은 logical을하는 sparse 매트릭스를 만드는 것입니다 true 그들은 1 NN에 행 위치에 위치하도록 l 벡터를 사용하여 직접 행의 양과 열 위치입니다. 그런 다음이 logical 행렬을 사용하여 행렬 에 색인을 작성한 다음 모든 항목을 요약하십시오. 즉이 행의 총 수를 계산으로

s = sparse(1:size(a,1), l, true); 
sumval = sum(a(s)); 

size(a,1)는, 우리의 경우 N이 될 것입니다. 방금 코드를 컴팩트하게 만들기 위해 sparse 호출 안에 배치하기로 결정했습니다.

+0

인덱스 배열이 희박한 숫자 배열을 인덱싱 할 수 있습니까? – Divakar

+0

@Divakar - Blah. 최종 입력 매개 변수를 'true'로 변경하려고했습니다. 내 목표에 그것을했지만 내 게시물을 변경하는 것을 잊어 버렸습니다. 오타를 찾아 주셔서 감사합니다! 내 설명에서 "true"로 설정하려고했지만 내 코드에서 설정하는 것을 잊어 버린 것을 볼 수 있습니다. – rayryeng

+0

그래, 지금 나를 위해 일한다! – Divakar