【问题标题】:Creating Individual Matrix based on Label Matrix from DataMatrix根据 DataMatrix 中的标签矩阵创建单个矩阵
【发布时间】:2011-06-14 11:23:40
【问题描述】:

label 为大小为 N x 1(双精度型)的矩阵,data 为大小为 N x 的矩阵M(双精度型)。 Label 矩阵中的条目看起来像 [ 1; 23; 135; .....; 6] 这表明

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

我想创建一个单元格数组,比如 Individual{i},它存储属于标签 idata 矩阵的所有行> 由 label 矩阵给出。

生成的 Individual{i} 矩阵的大小将是 N_i x M

除了逐行循环 datalabel 矩阵之外,还有什么有效的方法吗?

【问题讨论】:

  • 什么是 N(i)?在您问题的第一行中,N 是一个标量......到最后,您将像数组一样索引它。我认为它应该是Label(i)中的位数?你能把你的问题说得更准确一点吗?是不是一定要在 Label 中使用这个奇怪的索引,还是可以改一下?
  • 我已经编辑了声明。 N_i 只不过是 data 矩阵中带有标签 i 的行数。

标签: matlab


【解决方案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_isum(L(:, i))L' * data 将计算data 中带有标签L 的所有行的总和。

data 到达Individual 元胞数组后,您想对它做什么?几乎可以肯定有更好的方法来做到这一点......

【讨论】:

    【解决方案2】:

    给定正确的变量: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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-23
      • 2013-09-15
      • 1970-01-01
      相关资源
      最近更新 更多