【问题标题】:splitting a matlab matrix into several equal parts将matlab矩阵分成几个相等的部分
【发布时间】:2012-11-25 00:10:14
【问题描述】:

我有一个大小为64500x17 的矩阵。它表示检测到的 texton 特征,我必须使用这些特征来为 kmeans 找到 5 个质心。

我需要的是:

  • 将此矩阵拆分为 5 个12900x17 矩阵
  • 找到方法
  • 将这些连接成一个5x17 矩阵以输入kmeans 的开始参数。

我知道如何做几乎所有事情(catkmeans 等),但我只是想找到一种方法将矩阵拆分为 5 部分,或者求和/除以所需的大小。

除非绝对必要,否则禁止我过度使用 for 循环(出于效率考虑)。

我在其他问题中找不到任何相关的例子,所以如果已经回答,请多多包涵。

【问题讨论】:

    标签: matlab matrix k-means


    【解决方案1】:

    要获取第一个子矩阵,请使用冒号:

    A(1:12900,:)
    

    然后

    A(12901:12900*2,:)
    

    等等。

    【讨论】:

      【解决方案2】:

      只需使用索引并将提取的矩阵存储在单元格中以便于处理:

      data = rand(64500,17);
      Nsubsets = 5;
      Nsubsize = size(data,1)/Nsubsets;
      
      splitted_data = cell(Nsubsets ,1);
      splitted_data_means = cell(Nsubsets,1);
      
      for ii=1:Nsubsets 
          splitted_data{ii} = data((ii-1)*Nsubsize + (1:Nsubsize),:);
          splitted_data_means{ii} = mean(splitted_data{ii});
      end
      

      然后您可以通过以下方式加入这些方式:

      joined_means = cell2mat(splitted_data_means);
      

      或者只是为了搞定单线:

      joined_means = cell2mat(arrayfun(@(ii) mean(data((ii-1)*12900+(1:12900),:)),(1:5)','uni',false));
      

      使用@angainor 的mat2cell 会更简单:

      joined_means = cell2mat(cellfun(@mean,mat2cell(data, 12900*ones(5,1), 17),'uni',false));
      

      【讨论】:

        【解决方案3】:

        你可以使用mat2cell和这个oneliner

        C = mat2cell(A, repmat(12900, 5, 1), 17);
        

        mat2cell 的第二个参数是矩阵的行拆分。

        现在C 是一个元胞数组:

        C = 
        
        [12900x17 double]
        [12900x17 double]
        [12900x17 double]
        [12900x17 double]
        [12900x17 double]
        

        部分矩阵可以访问为

        C{1} etc.
        

        【讨论】:

        • repmat12900*ones(5,1)
        【解决方案4】:

        可能最快的解决方案是:

        data = rand(64500,17);
        Nsubsets = 5;
        Nsubsize = size(data,1)/Nsubsets;
        joined_means=squeeze(mean(reshape(data,Nsubsize,Nsubsets,size(data,2)),1));
        

        拆分第一维和第二维,然后您可以计算每个 Nsubsets 元素的第一维的平均值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多