5

「0」と「1」で構成される行列 A の各列について、「1」が存在する場合、最初に出現する列インデックスを見つけたいと思います。たとえば、A が次のように定義されているとします。

 A=[0 0 0 0;
 0 0 0 1;
 0 0 0 0;
 0 0 0 1;
 1 0 0 0;
 0 1 0 1;
 1 1 0 0]

結果は次のようになります。

b=[5 6 2]

「for」または「while」ループのない解決策を探しています。

私が思いついた1つの解決策:

 [b,~]=find(cumsum(cumsum(A))==1)

これを行うよりエレガントな方法はありますか?

4

2 に答える 2

5

これは投稿されたものよりも短く、ワンライナーです。コード:

[~,idx] = max(A(:,sum(A)>0));

出力:

idx =

     5     6     2

編集:あなたができることに気づきました:

[~,idx] = max(A(:,any(A)))
于 2013-03-30T14:38:36.327 に答える
5

@ネイサー - 良い答え。デフォルトでは、[a,m,c] = unique(J) は、J内の各一意の値の最後の出現mにインデックスを付けるベクトルを返します。代わりに使用します。[~,m] = unique(J, 'first');

[I,J] = find(A==1);
[~,m] = unique(J, 'first');
I(m)

ans =    
     5
     6
     2
于 2013-03-30T12:48:35.163 に答える