让标签为 N x 1 (类型为double)的矩阵,数据为 N x的矩阵M (类型为double)。 标签矩阵中的条目看起来像 [1; 23; 135; ....; <]> 传达了
数据矩阵中的第一行属于标签1
数据矩阵中的第二行属于标签2和标签3
数据矩阵中的第三行属于标签1,标签3和标签5等等
我想创建一个单元格数据个人{i} ,它存储数据矩阵中属于标签 i 由标签矩阵给出。
结果个人{i} 矩阵的大小 N_i x M 。
有没有有效的方法来做这件事而不是逐行循环数据和标签矩阵?
答案 0 :(得分:1)
我会将矩阵label
转换为布尔矩阵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
会计算data
中标签为L
的所有行的总和。
一旦到达data
单元阵列,您想对Individual
做什么?几乎可以肯定有更好的方法......
答案 1 :(得分:1)
如前所述,给出正确的变量: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