我会尝试将问题写在一个列表中,以便于理解:
T
大小为 的 matlab 表1000x30
。1
到20
。1
,这意味着这些行是“Class1”,有些行有值2
,有些行有值20
等等。1
但 10 行有类2
,500行有类3
,依此类推。这就是我想要做的:
10
分配给它的行数最少,count == 3
而其余类分配给它们的行数超过 3。YesNo
,其中只有值0
或1
.1
。3
)。YesNo
将为,1
而其余未选择的行的值为 0。1000
值的新列结束,其中 3*20 将有 1(3-> 分配给具有最低计数的类的行数,20-> 是类数)和 0对于其余的。我想知道如何在 MATLAB R2015b 中做到这一点?我知道我可以使用T.YesNo = newArr;
where newArr
is a 1000x1 double
have0
和1
values在表中创建一个新列。
作为一个小例子,如果T
是10x3
并且只有 3 个类 ( 1,2,3
),则如下所示T
:
ID Name Class
0 'a' 3
1 'b' 2
2 'a' 2
3 'b' 2
4 'a' 3
5 'a' 1
6 'a' 1
7 'b' 2
8 'b' 1
9 'a' 2
因此,如上所示,Class3 是计数最低的一个,只有 2 行。所以我想随机选择 Class1 和 Class2 的两行,然后将这些随机选择的行的新列的值设置为,1
而其余的将0
如下所示:
ID Name Class YesNo
0 'a' 3 1
1 'b' 2 0
2 'a' 2 1
3 'b' 2 0
4 'a' 3 1
5 'a' 1 0
6 'a' 1 1
7 'b' 2 0
8 'b' 1 1
9 'a' 2 1
请参阅下面的代码。它应该是不言自明的。如果有什么不清楚 - 请询问。
function q42944288
%% Definitions
MAX_CLASS = 20;
%% Setup
tmp = struct;
tmp.Data = rand(1000,1);
tmp.Class = uint8(randi(MAX_CLASS,1000,1)); % uint8 for efficiency
T = table(tmp.Data,tmp.Class,'VariableNames',{'Data','Class'});
%% Solution:
% Step 1:
[count,minVal] = min(histcounts(T.Class,'BinMethod','integers'));
% Steps 2+3:
T.YesNo = T.Class == minVal;
% Steps 4+5+6:
whichClass = bsxfun(@eq,T.Class,1:MAX_CLASS); % >=R2007a syntax
% whichClass = T.Class == 1:MAX_CLASS; % This is a logical array, >=R2016b syntax.
for indC = setdiff(1:MAX_CLASS,minVal)
inds = find(whichClass(:,indC));
T.YesNo(inds(randperm(numel(inds),count))) = true;
end
%% Test:
fprintf(1,'\nThe total number of classes is %d', numel(unique(T.Class)));
fprintf(1,'\nThe minimal count is %d',count);
fprintf(1,'\nThe total number of 1''s in T.YesNo is %d', sum(T.YesNo));
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句