这是一个示例矩阵:
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
所以我有:
x=
1 6 11
2 7 12
3 8 13
4 9 14
5 10 15
我想将给定列的上半部分元素(不包括中间元素)与前一列的下半部分重叠,在重叠部分添加元素。第一列和最后一列显然是异常(exception)(第一列没有前一列,也没有任何内容可以添加到最后一列)
在上面的简单示例中,为了清楚起见,我重写了该行以显示要重叠的数字:
x=[1,2,3,4,5;
6,7,8,9,10;
11,12,13,14,15]';
因此,我希望结果是:
y=[1;2;3;4+6;5+7;8;9+11;10+12;13;14;15];
现在,这只是一个非常简单的例子。生成的代码需要很好地扩展/有效地运行大数据。矩阵的大小可能类似于 120000x600,我认为生成的一维数组将类似于 37000000x1
最佳答案
原始问题的答案(添加移动的行):
这可以按如下方式完成:
- 生成索引向量 (
ind
),使要求和的x
条目具有相同的索引。这可以通过bsxfun
来完成.索引可以计算一次并重复用于不同的x
向量(索引不依赖于x
)。 - 使用该索引向量与
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
已编辑问题的答案(添加移动的列):
转置 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(:));
关于arrays - Matlab:将矩阵 reshape 为一维数组,并将重叠元素加在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29820664/