私は2列の行列を持っています。私は、例えば、カラム2 の数値の配列に基づいて行を削除したい:列2の配列が4 4 2 である場合Matlab:1つの列内の数字のシーケンスに基づいて行を削除します
Data = [1 2
3 4
5 4
6 2
7 0
8 2]
次に、行を削除するので、私は終わるだろう:
Data = [1 2
7 0
8 2]
私は2列の行列を持っています。私は、例えば、カラム2 の数値の配列に基づいて行を削除したい:列2の配列が4 4 2 である場合Matlab:1つの列内の数字のシーケンスに基づいて行を削除します
Data = [1 2
3 4
5 4
6 2
7 0
8 2]
次に、行を削除するので、私は終わるだろう:
Data = [1 2
7 0
8 2]
のは2つの[4 4 2]
配列にこれを表示するために、データにいくつかのデータを追加してみましょう:今すぐ
Data =
1 2
3 4
5 4
6 2
7 0
8 2
9 2
7 4
1 4
0 2
4 0
3 2
、これは仕事をして目を削除する必要があります2番目の列にシーケンス[4 4 2]
が含まE行:Data
に含まれる数値の範囲は、使用できる文字列で表現できる値を超えているがあれば@Adielによって提供さ
Seq=[4 4 2]; % sequence to delete rows according to
Data(bsxfun(@plus,findstr(Data(:,2)',Seq)',(0:length(Seq)-1)),:)=[]
Data =
1 2
7 0
8 2
9 2
4 0
3 2
回答は、greateのですこの方法:
r = size(Data, 1);
n = numel(Seq);
idx = bsxfun(@eq, Data(:,2), Seq);
idx =
0 0 1
1 1 0
1 1 0
0 0 1
0 0 0
0 0 1
我々その後、S:
Data = [1 2
3 4
5 4
6 2
7 0
8 2]
Seq = [4 4 2]
は、データの要素を持つ配列の平等を示して行列を作成します。 houldサイズ[r+1,n]
にidx
を作り直す:[4 4 2]
の配列はData
に含まれている場合
idx2 = false(r+1, n);
idx2(idx) = true;
idx2 =
0 1 0
1 1 1
1 0 0
0 0 1
0 0 0
0 1 0
0 0 0
今すぐ
idx2
の各列のすべての要素が1だから私たちは、このような行を見つける必要があるだろう。
f = find(all(idx2, 2));
f =
2
したがって、各配列の開始のインデックスが見出される。他の要素を見つけるには0:n-1
をf
に追加します。
idx3 = bsxfun(@plus, f, 0:n-1);
idx3 =
2 3 4
の要素を削除します。
Data(idx3, :) = [];
Data =
1 2
7 0
8 2
ありがとうございました!それは完璧に働いた。 – Diana