基于标签矩阵从DataMatrix创建单个矩阵

问题描述

| 设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