私はマトリックスを持っています
m =
2 2 1
3 2 1
0 4 1
0 4 1
5 4 1
0 5 2
1 2 2
1 3 2
1 4 2
1 1 3
0 2 3
0 3 4
0 3 4
これは潜在的にNx 3であり、Nは非常に大きくなる可能性があります。
ゼロがある最初の列(1-13)でインデックスを見つけたいのですが、重複する行があるか、行が一意である場合に限ります。2番目と3番目の列が同じであるが、最初の列がゼロ以外の行は必要ありません。つまり、最初の列にゼロがあり、2番目と3番目の列の対応する番号が、最初の列のゼロ以外の異なる番号を持つ別の番号と同じである場合、そのゼロのインデックスを無視します。したがって、上記の例では、インデックス6、11、12、13のみを返します。インデックス3、4は、それに類似した行(2列目と3列目)があるというルールに違反しているため、返さないでください。以下に示すように、最初の列は異なります。
0 4 1
0 4 1
5 4 1
遅い解決策の1つは、最初の列が0である行のインデックスを見つけてindm=m(:,1)==0
から、マトリックスの行を反復処理して、m
2番目と3番目の列が同じで1番目の列が異なるマトリックス()に他の行が存在するかどうかを確認することです。そのような場合が存在しない場合は、プログラムによって返されるリストに行のインデックスを追加します。ただし、この方法では、大きな行列を通過する「forループ」が必要になります。
これを解決する1つの方法(同じ列2と3を持つ他の行がある場合に行が不良であると想定)は、すべての異なる行を見つけて、最初の列がどこでも同じであるかどうかを確認することです。
%# uIdx is the same for sets of rows where m(i,2:3) is equal
[~,~,uIdx] = unique(m(:,2:3),'rows');
%# allZeros is true if all entries in the first column of m
%# corresponding to a set are the zero
allZeros = accumarray(uIdx,m(:,1),[],@(x)all(x==0));
%# a good row belongs to a set of rows from m(:,2:3)
%# where all corresponding entries in the first column are zeros
%# use allZeros(uIdx) to expand allZeros to size(m,1)
goodRowIndices = find(allZeros(uIdx) == true)
goodRowIndices =
6
11
12
13
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加