-1

マトリックスがある場合

F=[ 24 3  17 1;
    28 31 19 1;
    24 13 25 2;
    47 43 39 1;
    56 41 39 2];

最初の 3 列には特徴値があり、4 番目の列はクラス ラベル用です。私の問題は、特定の値のクラス ラベルが異なる場合に、同じ特徴値を取り除くことです。

行列の場合と同様にF、行 1、3、4、および 5 を削除する必要があります。これは、最初の列の 4 列目に 2 つの異なる値があり、3 列目 (39 と 39) のクラス ラベルが再び変更されたためです。出力は次のようになります

F=[28 31 19 1];
4

2 に答える 2

1

単純なアプローチは、列を反復処理し、値ごとに異なるクラスの数を数え、複数のクラスに関連付けられた値の行を削除することです。

F = [24 3 17 1; 28 31 19 1; 24 13 25 2; 47 43 39 1; 56 41 39 2];

%// Iterate over columns
for col = 1:size(F, 2) - 1

   %// Count number of different classes for each value
   [vals, k, idx] = unique(F(:, col));
   count = arrayfun(@(x)length(unique(F(F(:, col) == x, end))), vals);

   %// Remove values associated to more than one class
   F(count(idx) > 1, :) = [];
end

これにより、次の結果が得られます。

F =
    28    31    19     1
于 2013-03-14T12:41:44.833 に答える
0

arrayfun(編集済み)なしで、問題に対する別の見方

F = [24 3 17 1; 28 31 19 1; 24 13 25 2; 47 43 39 1; 56 41 39 2];

両方のクラスを分離します。

A1 = F(F(:,4)==1,1:3);
A2 = F(F(:,4)==2,1:3);

それらを3Dマトリックスに複製して、class1の各行をclass2の各行と比較します。

B2 = repmat(shiftdim(A2',-1),size(A1,1),1);
B1 = repmat(A1,[1,1,size(A2,1)]);
D4 = squeeze(sum(B1 == B2,2));

重複した行を削除する

A1(logical(sum(D4,2)),:) = [];
A2(logical(sum(D4,1)),:) = [];

元の行列を再構築する

R = [A1 ones(size(A1,1),1);A2 2*ones(size(A2,1),1)];
于 2013-03-15T18:13:16.393 に答える