2013-07-16 2 views
0

행렬에서 '0'을 제외하고 '행렬'행렬에서 각 행의 최소 요소 인덱스를 찾는 코드를 작성하려고합니다.MATLAB에서 행렬의 각 행의 최소 요소 인덱스를 얻는 방법

+2

시도는 어떻게 진행되고 있습니까? 코드를 우리와 공유하십시오. –

+2

http://www.mathworks.com/help/matlab/ref/min.html 두 번째 출력을 살펴보십시오. 또한 모든 0을 'inf'로 설정하는 것을 고려하십시오. – Dan

+1

http://bit.ly/ 1aq19oE - 인터넷에서 정보를 찾는 방법입니다. – Mikhail

답변

1

거리 매트릭스가 (거대한) 희소 매트릭스 인 경우이 문제는 다소 중요하지 않습니다. 가장 좋은 방법은 각 행의 0이 아닌 각 요소에서 (최대 값 * 2)을 뺍니다. 이것은 추악하고 hackish 보인다하지만 그것을 해결하는 다른 효율적인 방법을 생각할 수 없다.

sub = max(0, max(myArray,[],2) * 2); 
[i,j,v] = find(myArray); 
v -= sub; 
myArray = sparse(i,j,v); 
[junk mi] = min(myArray,[],2); 

EDIT : 행 내의 요소의 크기가 매우 다른 경우 정밀도 문제가 있습니다. 이 경우 부정적인 반전을 대신 수행 할 수 있습니다. 이러한 방법으로, 당신은 (또는 상수)

posOnly = ~any(myArray < 0, 2); 
[i,j,v] = find(myArray); 
inds = posOnly(i); 
v(inds) = -1 ./ v(inds); 
myArray = sparse(i,j,v); 
[junk mi] = min(myArray,[],2); 

는 (의 사용을 참고 행렬에 다른 요소의 크기를 결합하지 않는 ~ 아니라 모든보다 (myArray의 < 0) (에서 myArray> = 0) (myArray < 0)은 적어도 myArray만큼 희박하지만 (myArray> = 0)은 희소하지 않습니다.

+0

흥미로운 생각 -하지만 정의에 따르면 희소 행렬에는 "제로 요소"가 없습니다 ... "S = 희소 (A)는 0 행렬을 모두 압축하여 전체 행렬을 희소 형태로 변환합니다". http://www.mathworks.com/help/matlab/ref/sparse.html – Floris

+0

당신은 그것을 잘못 알고 있습니다. 가정에 따르면, 희소 행렬의 대부분 요소는 0입니다. "제로 요소를 짜내는 것"은 명시 적으로 메모리에 저장하지 않는 것을 의미합니다. 저장되지 않았다고해서 그것이 행렬의 일부가 아니라는 것을 의미하지는 않습니다. }}}}}}}}}}}}}}}}}}}}}}}}}}}}} 내 코드의 목적은 행렬의 0이 아닌 모든 값을 음수로 만들 수있을만큼 멀리 이동시키는 것입니다 모든 0 요소의 값을 변경할 수 없거나 OOM 오류가 발생할 수 있습니다. 예를 들어, sprand (50000500000.00001)에 의해 생성 된 행렬에 대한 답을 찾으십시오. 그런 다음 동일한 매트릭스에서 내 대답을 시도하십시오. – dspyz

+0

OK - 당신이 한 일을 알고 있습니다. 좀 더 효율적인 해법은 다음과 같습니다 :'sub = max (M (:)) + 1; [~, mi] = min (spfun (@ (x-sub), myArray), [], 2);'. 이 방법은'sub'를 계산하는 속도가 다소 빠르며 (엘리먼트 단위의 곱셈은없고, 단일 연산은'max' 연산입니다.),'junk'에 반환 값을 할당하지 않고'spfun'을 사용하면'find- 희박한 것. 이것은'myArray'가 스파 스 (sparse)로 시작했다고 가정합니다 ...그렇지 않으면 나의 초기 해결책이 효과가있다. – Floris

1

댄의 힌트 사용 : mi

myArray(myArray==0)=Inf; 
[m mi] = min(myArray, [], 2); 

값은 각 행의 최소의 요소의 인덱스가 될 것이다. 최소값은 두 번째 차원을 따라 취해진 것입니다 (dspyz의 제안에 따라).

+0

min (myArray ') min (myArray, [], 2)이어야합니다. nx1 배열에서 올바르게 작동합니다. – dspyz

관련 문제