2013-10-14 3 views
2

희소 행렬에서 행당 최소 0이 아닌 값을 얻고 싶습니다. 밀도가 높은 행렬에 대해 찾은 솔루션은 NaN 또는 Inf으로 0 값을 마스킹하도록 제안했습니다. 그러나 이것은 희소 매트릭스에 대해서는 분명히 작동하지 않습니다. 내가 분명히 제외희소 행렬에서 행 단위 최소값 찾기

minValues = min(A, [], 2); 

함께 얻을 것 같은

이상적으로는, 나는 인해에 min 모든 것을 제로의 열 벡터 날 잎을 사용하여 모든 행 방향 최소값의 열 벡터를 얻어야한다 희소성. find을 사용하는 솔루션이 있습니까?

답변

3

이것은 accumarray에 적합합니다. 비어있는 요소에 0을 가정

vals = [3 1 1 9 7 4 10 1]; % got this from randi(10,1,8) 
S = sparse([1 3 4 4 5 5 7 9],[2 2 3 6 7 8 8 11],vals); 

각 행의 최소 값을 취득 다음 희소 행렬을 고려해

[ii,jj] = find(S); 
rowMinVals = accumarray(ii,nonzeros(S),[],@min) 

유의의 두 행인 행 4 rowMinVals 5, 여러 제로가 아닌 값 S는 행의 최소 동일하다 :

rowMinVals = 
    3 
    0 
    1 
    1 % min([1 9] 
    4 % min([7 4] 
    0 
    10 
    0 
    1 

당신의 희소 행렬의 마지막 행 (들)이 아닌 0을 포함하지 않는 경우,하지만 당신은 분 행을 원하는 값 출력은

rowMinVals = accumarray(ii,nonzeros(S),[numRows 1],@min). 

는 또한, 아마도 당신은 또한 출력의 기본 0 포함되지 않도록하려면, 다음과 같이 예를 들어, accumarray 명령을 변경, 당신은 numRows을 반영합니다.

rowMinVals = accumarray(ii,nonzeros(S),[numRows 1],@min,NaN) 

rowMinVals = 

    3 
    NaN 
    1 
    1 
    4 
    NaN 
    10 
    NaN 
    1 
    NaN 
    NaN 
    NaN 

아니면 다섯 번째 입력 인수 issparse을 스파 스 매트릭스를 계속 사용할 수 있습니다 : : 그 처리 방법 중 하나는 NaNfillval 입력 인수를 설정하는 것입니다

>> rowMinVals = accumarray(ii,nonzeros(S),[],@min,[],true) 
    rowMinVals = 
    (1,1)  3 
    (3,1)  1 
    (4,1)  1 
    (5,1)  4 
    (7,1)  10 
    (9,1)  1 
+1

니스! 매우 정교한 답변 주셔서 감사합니다! – Lisa

+0

큰 것 또는 집으로 돌아가는 것, 맞습니까? 그러나 진지하게,'accumarray'는 매우 다양한 기능입니다. 또한 히스토그램을 만드는 훌륭한 대안입니다. – chappjc