2013-10-27 5 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に基づくソリューションです。

あなたが max使用することができます
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'はsizeを '' '' ''として指定する必要があるため、 '' accumarray(r、c、[size(A、1)、1]、@ min、NaN) [M 1] '(少なくともMATLABの私のバージョンでは) – KQS

15

sel equalseゼロのため

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

行が - すべてゼロであり、cの対応する列は無視されるべきです。

結果:

あなただけの最初の次元に 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