基于DataMatrix的Label Matrix创建单个矩阵

时间:2011-06-13 10:35:44

标签: matlab

标签 N x 1 (类型为double)的矩阵,数据 N x的矩阵M (类型为double)。 标签矩阵中的条目看起来像 [1; 23; 135; ....; <]> 传达了

数据矩阵中的第一行属于标签1
数据矩阵中的第二行属于标签2和标签3
数据矩阵中的第三行属于标签1,标签3和标签5等等

我想创建一个单元格数据个人{i} ,它存储数据矩阵中属于标签 i 由标签矩阵给出。

结果个人{i} 矩阵的大小 N_i x M

有没有有效的方法来做这件事而不是逐行循环数据标签矩阵?

2 个答案:

答案 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