假设我在 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 的维度非常大,我如何在没有循环的情况下有效地执行此过程?
感谢您的回答。
答案 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(:)).';