Matlab:将矩阵重新整形为一维数组,重叠元素加在一起

use*_*554 3 arrays matlab matrix

这是一个示例矩阵:

x=[1,2,3,4,5;6,7,8,9,10;11,12,13,14,15]'; % 1:5 in 1st column, 6:10 in 2nd etc
Run Code Online (Sandbox Code Playgroud)

所以我有:

x=
1 6  11
2 7  12
3 8  13
4 9  14
5 10 15
Run Code Online (Sandbox Code Playgroud)

我想将给定列的元素的上半部分(不包括中间元素)与前一列的下半部分重叠,在重叠中添加元素.第一列和最后一列显然是异常(第一列没有前一列,也没有添加到最后一列)

在上面的简单示例中,为了清楚起见,我重写了该行以显示重叠的数字:

x=[1,2,3,4,5;
         6,7,8,9,10;
               11,12,13,14,15]';
Run Code Online (Sandbox Code Playgroud)

因此,我希望结果如下:

y=[1;2;3;4+6;5+7;8;9+11;10+12;13;14;15];
Run Code Online (Sandbox Code Playgroud)

现在,这只是一个非常简单的例子.生成的代码需要使用大数据进行有效扩展/高效运行.矩阵的可能大小将类似于120000x600,我认为生成的1D阵列将类似于37000000x1

Lui*_*ndo 5

回答原始问题(添加移位):

这可以按如下方式完成:

  1. 生成索引向量(ind),使得要求的条目x具有相同的索引.这可以通过以下方式完成bsxfun.索引可以计算一次并重用于不同的x向量(索引不依赖于x).
  2. 使用该索引向量与以下内容进行求和accumarray:

码:

n = ceil(size(x,2)/2);
ind = bsxfun(@plus, 1:size(x,2), (0:size(x,1)-1).'*n); %'// step 1. Valid for any x
y = accumarray(ind(:), x(:));                          % // step 2. Depends on x
Run Code Online (Sandbox Code Playgroud)

回答已编辑的问题(添加移位):

转置x并按上述步骤操作:

x = x.';
n = ceil(size(x,2)/2);
ind = bsxfun(@plus, 1:size(x,2), (0:size(x,1)-1).'*n);for any x
y = accumarray(ind(:), x(:));
Run Code Online (Sandbox Code Playgroud)