问题描述
|
设label为大小为N x 1的矩阵(双精度型),数据为大小为N x M的矩阵(双精度型)。 Label矩阵中的条目看起来像[1; 23; 135; ....; 6]表示
数据矩阵中的第一行属于标签1
数据矩阵中的第二行属于标签2和标签3
数据矩阵中的第三行属于标签1,标签3和标签5,依此类推
我想创建一个单元格数组,称为Individual {i},该数组存储数据矩阵中属于标签i给出的标签i的所有行。
所得的Individual {i}矩阵的大小为N_i xM。
有什么有效的方法可以执行此操作,而不是逐行循环数据和标签矩阵吗?
解决方法
我将把矩阵ѭ0变成布尔矩阵L:
L = [ 1 0 0 0 0 0 ;
0 1 1 0 0 0 ;
1 0 1 0 1 0 ;
...
0 0 0 0 0 1 ];
举个例子如果N或标签数很大,则可以使用稀疏矩阵。
然后我认为您所说的N_i
是sum(L(:,i))
,而L\' * data
将计算label5ѭ中带有标签L
的所有行的总和。
一旦到达Individual
细胞阵列,您想对ѭ5做什么?几乎肯定有一种更好的方法...
, 给定正确的变量:如您所描述的N,M,data,label
,下面是创建所需单元格数组Individual
的示例代码:
%# convert labels to binary-encoded format (as suggested by @Tom)
maxLabels = 9; %# maximum label number possible
L = false(N,maxLabels);
for i=1:N
%# extract digits of label
digits = sscanf(num2str(label(i)),\'%1d\');
%# all digits should be valid label indices
%assert( all(digits>=1) && all(digits<=maxLabels) );
%# mark this row as belong to designated labels
L(i,digits) = true;
end
%# distribute data rows according to labels
individual = cell(maxLabels,1);
for i=1:maxLabels
individual{i} = data(L(:,i),:);
end