の最初の非ゼロ要素、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];
どのように各行の最初の非ゼロ要素のベクトルを得ることができますか?
の最初の非ゼロ要素、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];
どのように各行の最初の非ゼロ要素のベクトルを得ることができますか?
あなたは次のように行ごとに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
すべてゼロの行がある場合、これは失敗します。 – Jonas
は、行がすべてゼロの場合でも動作します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);
+1 'accumarray'は、 –
ですが、' accumarray'はsizeを '' '' ''として指定する必要があるため、 '' accumarray(r、c、[size(A、1)、1]、@ min、NaN) [M 1] '(少なくともMATLABの私のバージョンでは) – KQS
: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);
これは、より大きい行列を扱うときに' find'が爆発する可能性があるので、より良い解決策です。 – Maddy
はあなたが何を期待します「すべてゼロ」の行がある場合は? – Shai