matlab中重叠的特征值

时间:2013-03-14 11:48:49

标签: matlab

如果我有一个矩阵

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

在前三列中我有特征值,第四列用于类标签。我的问题是当类标签对于特定值不同时,去掉相同的特征值。

F矩阵一样,我必须删除行1,3,4和5,因为对于第一列,第四列中有两个不同的值,第三列(39和39)的值与类相同标签再次改变了。 所以输出应该看起来像

F=[28 31 19 1];

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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)];