2013-10-27 56 views
7

例如的第一非零元素,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]; 

如何可以獲得每一行的第一非零元素的向量?

+1

你會期望如果有一個「全零」行? – 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

如果有一行全爲零,這將失敗。 – 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