如果我有一个矩阵
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];
答案 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)];