将列末尾的元素与下一行开头的元素相加

时间:2021-01-25 19:19:57

标签: arrays performance matlab matrix

假设我在 Matlab 中有以下矩阵:

A = [1 2 3
     4 5 6
     7 8 9
     3 2 1
     6 5 4]; 

现在假设我想要一个如下的向量:

v = [1 4 7 3 6 0 0 0 0 0 0] + [0 0 0 2 5 8 2 5 0 0 0] + [0 0 0 0 0 0 3 6 9 1 4];

也就是说,我想按列读取 A,但我希望每列的最后 2 个元素与下一列的前 2 个元素相加(第一列的最后一个元素与第二个元素第 2 列、第 1 列的第 4 个元素与第 2 列的第 1 个元素等)

现在,如果 A 的维度非常大,我如何在没有循环的情况下有效地执行此过程?

感谢您的回答。

2 个答案:

答案 0 :(得分:4)

您可以从填充零的列创建一个稀疏矩阵,并沿其第二个维度求和:

s = size(A);
f = s(1) - 2;
r = (1:s(1)).' + (0:f:(s(2) - 1) * f);
c =  repmat(1:s(2), s(1), 1);
M = sparse(r, c, A);
v = full(sum(M, 2));

答案 1 :(得分:2)

@rahnema1's answer 的一个小变体,它利用了 sparse 自动在重合索引处添加值这一事实:

A = [1 2 3; 4 5 6; 7 8 9; 3 2 1; 6 5 4]; % data matrix
N = 2; % shift to be applied to each column
s = size(A);
f = s(1) - N;
r = (1:s(1)).' + (0:f:(s(2) - 1) * f);
v = full(sparse(1, r, A));

等效地,您可以使用 accumarray 代替 sparse,将最后一行替换为

v = accumarray(r(:), A(:)).';
相关问题