2017-03-15 1 views
1

행렬이 distance = [d11,d12,d13,d14;d15;...;dn1,dn2,dn3,dn4,dn5];이고 벡터가 index(n,1)입니다. 인덱스의 값은 1에서 5 사이입니다.루프가없는 Matlab 연산

벡터 R (1,5) 인 경우 인덱스에 따라 거리의 합을 구합니다.

예 : 실행시의 경우를 최소화하기 위해 경우 조건 5 :

distance = [1,2,4,1,2 ; 4,5,6,1,6 ; 7,8,9,5,8] and index = [1;1;3]

그래서, 내가 조건은 1 이상의 루프를 사용하지 않는 것입니다 R(1) = 1+4 = 5, R(2) = 0, R(3) = 9, and R(4) = R(5) = 0

을 원하는 수십억 포인트가 있습니다.

아마도 arrayfun이 가능할 수도 있지만 성공하지 못할 수도 있습니다.

안부

답변

1

당신은 값이 관련된 경우 1을 포함하는 매트릭스를 생성하기 위해 bsxfun를 사용하고 0 그렇지 수 있습니다, 당신은 요약해야하는 요소를 찾으려면. 이것은 벡터 [1, 2, 3, 4, 5]을 만들고 index 그 벡터 사이의 요소 - 현명한 비교를 할 것입니다

bsxfun(@eq, index, 1:5) 

으로 수행 할 수 있습니다. (! 소자 현명)

>> R = sum(bsxfun(@eq, index, 1:5) .* distance, 1); 

R = 

    5  0  9  0  0 
결과,이 함수의 결과는 이제 distance 행렬이 행렬 곱 결국 각 컬럼을 통해 합산 수

ans = 

    1  0  0  0  0 
    1  0  0  0  0 
    0  0  1  0  0 

+0

감사합니다. 이제 저는 R의 각 가치를 정상화하고 싶습니다. 저를 도와 줄 수 있습니까? 루프없이 작업하는 데 어려움이 있습니다 ... – gpbdr13

+0

'R'을 길이 1, 즉'R (1) = 5/14'와'R (3) = 9/14'로 정규화 하시겠습니까? 너의 모범? – hbaderts

+0

나는 해결책을 찾는다 : A = bsxfun (@eq, index, 1 : 5) R = 합계 (bsxfun (@eq, index, 1 : 5). * 거리, 1) ./ 합계 1 : 5)); – gpbdr13