【问题标题】:Adding rows at equal interval in matlab在matlab中以相等的间隔添加行
【发布时间】:2015-05-31 12:55:01
【问题描述】:

我有一个 6954 x 222 矩阵,我想对每 122 行求和以获得 57 x 222 矩阵。如果有人有解决方案,请帮助我。

【问题讨论】:

  • 不是完全相同的副本,但请在此处寻找灵感:stackoverflow.com/questions/23879888/… - 他们在这里进行减法,每三行完成一次。修改代码,以便添加并汇总超过 122 行。
  • 另外,请尝试始终在问题中包含您尝试过的内容。如果你有机会看看stackoverflow.com/tour

标签: matlab matrix


【解决方案1】:

使用permutereshape,当然还有sum

rowstosum = 122;
out = permute(sum(permute(reshape(A.',size(A,2),rowstosum,[]),[2 1 3])),[3 2 1])

样本检查(对于 10x3 矩阵和 2 rowstosum

>> A

A =

 8     8     2
 2     9     5
 9     8     2
10     4     1
 6     6     9
 9     1     6
 6     2    10
 2     2     7
 2     7     6
 5     5     9

>> out

out =

10    17     7
19    12     3
15     7    15
 8     4    17
 7    12    15

【讨论】:

    【解决方案2】:

    这应该是一种有效的方法,因为它使用轻量级的reshapesqueeze 以及强制性的sum -

    cutlen = 122 %// Cut after this many number of rows, for summing purposes
    out = squeeze(sum(reshape(A,cutlen,[],size(A,2)),1));
    

    【讨论】:

      【解决方案3】:

      这应该也很有效:

      A = ... %// input array
      
      iL = 122;   %// interval length
      y = filter(ones(1,iL),1,A);
      y = y(iL:iL:end,:);
      

      conv/conv2 不同,filter 函数还允许对二维数据进行一维卷积。但是Divakar's approach 似乎是最快的。

      不过,这种方法似乎非常接近:

      out = reshape(sum(reshape(A,iL,[])),[],size(A,2));
      

      【讨论】:

        【解决方案4】:

        sparse函数可以用来做行的累加。

        A 表示矩阵,n 表示要求和的行数,B 表示结果。那么

        r = repmat(ceil(1/n:1/n:size(A,1)/n).',1,size(A,2)); %'
        c = repmat(1:size(A,2),size(A,1),1);
        B = full(sparse(r,c,A));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-04-03
          • 2019-02-06
          • 1970-01-01
          • 1970-01-01
          • 2019-03-08
          • 2021-01-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多