2016-04-29 14 views
0

のは、私は行列matlabの行列の各行で追加の重複要素を削除するにはどうすればよいですか?

A = [2 3 2 5 6 7 2; 
    1 2 5 4 5 6 7; 
    7 5 3 9 8 1 2]; 

どのように私は2 Sを削除し、最初の行に1 2を維持し、2行目のみ1 5を維持しますか?あるとしましょうか

+0

各行の長さが異なるため、結果は行列にはなりません。どのような結果が欲しいですか?行ベクトルのセル配列? –

答えて

1

を与えます値が行内に重複している場合は、次のようにすることができます。

012そこから

is_duplicate =

0  0  1  0  0  0  1 
0  0  0  0  1  0  0 
0  0  0  0  0  0  0 

、それはあなたが探しているものな結果によって決まります。あなたはNaNまたはいくつかの他の値に重複を設定することができ、またはあなたはNaNにそれらを設定することもできますが、その行の最後にそれらをシフトし、次のようなものを使用して:

col_idx = cumsum(~is_duplicate, 2); 
idx = bsxfun(@plus,(col_idx-1)*size(A,1), (1:size(A,1))'); 
A_new = nan(size(A)); 
A_new(idx(~is_duplicate)) = A(~is_duplicate); 

A_new =

2  3  5  6  7 NaN NaN 
1  2  5  4  6  7 NaN 
7  5  3  9  8  1  2 
+0

ありがとうございます。これは私が望んでいたものです、 – Gaze

4

各行の長さが異なるため、結果は行列にはなりません。次のように行のセル配列がベクトルとしてあなたは結果を得ることができます。

B = mat2cell(A, ones(size(A,1),1)); %// convert matrix to cell array of its rows 
B = cellfun(@(x) unique(x,'stable'), B, 'uniformoutput', 0); %// stably remove duplicates 

あなたの例の行列について

A = [2 3 2 5 6 7 2; 
    1 2 5 4 5 6 7; 
    7 5 3 9 8 1 2]; 

これはあなたが知りたい場合は

B{1} = 
    2  3  5  6  7 
B{2} = 
    1  2  5  4  6  7 
B{3} = 
    7  5  3  9  8  1  2 
+0

ありがとうございます。これは素晴らしいコードですが、私は行ベクトルではなく行列として保つことを好みます。私はダンマンの答えを取る。素敵な一日を! – Gaze

+0

@Gazeもちろん!私はあなたが望んでいたか分からなかった。良い一日を過ごしてください! –

関連する問題