2013-10-27 5 views

ответ

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

это не удастся, если есть строка всех нулей. – Jonas

9

Вот решение, основанное на accumarray, что будет работать, даже если строка все нули.

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

FYI, вам может понадобиться' accumarray (r, c, [size (A, 1), 1], @ min, NaN) ', потому что' accumarray' требует, чтобы размер указывался как ' [M 1] '(по крайней мере, в моей версии MATLAB) – KQS

15

Вы можете использовать max:

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

Ряды, для которых sel equalse ноль - все нули и соответствующий столбец в c следует игнорировать.

Результат:

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

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

Для того, чтобы найти первый ненулевой индекс строки (для каждого столбца) нужно просто применить max на первое измерении:

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

Это лучшее решение, так как' find' может взорваться при работе с большими матрицами. – Maddy