-1

如果我有一个矩阵

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 行,因为对于第一列,第四列有 2 个不同的值,第三列(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 回答