如果我有一个矩阵
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];
如果我有一个矩阵
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];
直接的方法是遍历列,计算每个值的不同类的数量,并删除与多个类关联的值的行。
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
另一个问题,没有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)];