2013-10-27 3 views
7

먼저 0이 아닌 요소matlab에 각 행 또는 열의 예

A = [ -1 0 -2 0 0 
    2 8 0 1 0 
    0 0 3 0 -2 
    0 -3 2 0 0 
    1 2 0 0 -4]; 

방법 I는 각 행의 첫 번째 제로 벡터 요소를 얻을 수 있는가?

+1

당신이 무엇을 기대 "all zeros"행이 있다면? – Shai

답변

1

다음과 같이 각 행에 대해 find 기능을 실행하여 작업을 수행 할 수 있습니다

다음
A = [ -1 0 -2 0 0 
    2 8 0 1 0 
    0 0 3 0 -2 
    0 -3 2 0 0 
    1 2 0 0 -4]; 

% make cell of rows 
cellOfRows = num2cell(A, 2); 

% apply find function for each row 
indexOfFirstNonZeroValues = cellfun(@(row) find(row, 1, 'first'), cellOfRows); 


indexOfFirstNonZeroValues = 

    1 
    1 
    3 
    2 
    1 
+1

모두 0의 행이 있으면이 작업은 실패합니다. – Jonas

9

연속 모두 0 인 경우에도 작동합니다 accumarray 기반으로하는 솔루션이다. 무시해야 모든 0과 1 c의 해당 열이 - 어떤 sel equalse 제로에 대한

>> [sel, c] = max(A ~=0, [], 2); 

행 :

A = [ -1 0 -2 0 0 
    2 8 0 1 0 
    0 0 3 0 -2 
    0 -3 2 0 0 
    1 2 0 0 -4]; 

[r,c] = find(A); 

%# for every row, take the minimum column index and put NaN if none is found 
firstIndex = accumarray(r,c,[size(A,1),1],@min,NaN); 
+0

+1 다용도'accumarray'는 –

+1

입니다. 참고로, 'accumarray'는 크기를''(', ')' '로 지정해야하기 때문에' [M 1]'(적어도 MATLAB 버전에서) – KQS

15

당신은 max를 사용할 수 있습니다.

결과 :

당신은 단지 첫 번째 차원에 max를 적용해야합니다 (각 열에 대한) 최초의 비 - 제로 행 인덱스를 찾기 위해
>> [sel c]= max(A~=0, [], 2) 

sel = 
1 
1 
1 
1 
1 
c = 
1 
1 
3 
2 
1 

:

>> [sel r] = max(A~=0, [], 1); 
+0

더 큰 행렬을 작업 할 때'find'가 폭발 할 수있는 더 나은 해결책입니다. – Maddy