2012-11-11 4 views
5

여기에 두 개의 행렬이 있는데, 하나는 비용을 나타내고 다른 하나는 비교할시기를 결정합니다.matlab에서 min 요소의 색인을 찾으십시오.

cost =  [0.2 0.0 0.3; 0.4 0 0; 0.5 0 0]; 
available = [1 1 0 ; 1 0 0; 0 0 0]; 
available = logical(available); 

내가 0.2, 0.00.4을 비교하고 비용 매트릭스 (1, 2) 또는 4입니다 0.0의 인덱스를 반환이 경우 비용 행렬의 최소 가능한 요소의 인덱스를 얻으려면 .

나는

이 최소 비 제로 비용을 얻을하는 데 도움이 될 것입니다
mul = cost .* available;  % Zero if not available, but I can't know if it is zero because cost is zero 
mul(~mul) = nan;    % Set zero to be NaN 
[minVal, minId] = min(mul) 

을 시도했지만 사용할 수있는 제로 요소가 존재하는 경우, 그것은 잘못된 것입니다.

이렇게 할 수있는 더 좋은 방법이 있습니까?

+3

오프 주제 : 함수와 같은 변수 이름 지정을 자제해야합니다 (예 : 'min'). –

답변

2

다음과 같은 두 가지 해결책이 있습니다. 둘 다 본질적으로 모든 비가 용 비용을 Inf으로 변환하는 것과 관련이 있습니다.

%#Set up an example 
Cost =  [0.2 0 0.3; 0.4 0 0; 0.5 0 0]; 
Available = [1 1 0; 1 0 0; 0 0 0]; 

%#Transform non-available costs to Inf 
Cost(Available == 0) = Inf; 

%#Obtain indices using find 
[r, c] = find(Cost == min(min(Cost))) 

%#Obtain linear indices and convert using ind2sub 
[~, I1] = min(Cost(:)); 
[r2, c2] = ind2sub(size(Cost), I1); 

두 솔루션은 고유 한 최소값이없는 경우에만 첫 번째 최소값을 반환합니다. 또한이 방법은 모든 가능한 비용이 Inf 인 경우에 실패합니다 (그러나 모든 비용이 무한대라면 더 큰 문제가 발생했을 것입니다 ...).

몇 가지 속도 테스트를 수행했으며, 두 번째 방법은 Cost의 크기와 상관없이 확실히 빠릅니다. 따라서 엄격하게 지정해야합니다. 또한 선형 인덱스와 첨자 인덱스가 필요없는 경우에는 물론 호출을 ind2sub으로 끌어 놓을 수 있습니다. 그러나 이것은 당신에게 효율성면에서 엄청난 절감을주지는 않습니다. 따라서 첨자 인덱스에 대한 선호도가 있다면 그것을 사용해야합니다.

+0

이 문제가 해결되지 않았다고 가정합니다. 'min (cost (available));'cost (available)'에 의해 반환 된 새로운 행렬에 최소값을 반환합니다.이 경우 3입니다. 그러나이 값은 4가되어야합니다. – Ovilia

+0

첫 번째 최소 요소이면 충분합니다. – Ovilia

+0

@Ovilia 나는 그것을 지금 가지고 있다고 생각한다 ... –

관련 문제