Matlab中优雅实现矩阵相邻n行求和的方法(支持列向量)
在Matlab中实现相邻n行/元素求和的优雅方法
下面提供两种简洁高效的实现方式,同时支持矩阵(按行求和)和列向量场景:
方法1:reshape + sum(适用于行数/元素数为n整数倍的情况)
利用reshape将矩阵的相邻n行重组为一个维度,再通过sum直接求和,代码简洁且性能优异。
矩阵示例(n=2)
A = [1 2; 3 4; 5 6; 7 8; 9 10; 11 12]; n = 2; % 重组维度并求和:将A转为n行、分组列数、原列数的三维数组,沿第一维求和后调整为结果格式 B = squeeze(sum(reshape(A, n, [], size(A,2)), 1))';
运行结果:
B = 4 6 12 14 20 22
列向量示例(n=2)
v = [1;3;5;7;9;11]; n = 2; B_v = sum(reshape(v, n, []), 1)';
运行结果:
B_v = 4 12 20
方法2:movsum(支持非整数倍的行数/元素数)
如果矩阵行数或向量元素数不是n的整数倍,且希望保留最后一组不足n个的元素求和,movsum(移动求和)是更灵活的选择。通过设置窗口为向前n-1个元素+当前元素,再提取每隔n的结果即可。
矩阵示例(n=2)
A = [1 2; 3 4; 5 6; 7 8; 9 10; 11 12]; n = 2; % 沿行方向做窗口大小为n的移动求和,窗口仅包含当前行及之前n-1行 temp = movsum(A, [n-1 0], 1); % 提取第n、2n、...行作为结果 B = temp(n:n:end, :);
运行结果与方法1一致。
非整数倍场景示例(比如n=2,矩阵7行)
A = [1 2; 3 4; 5 6; 7 8; 9 10; 11 12; 13 14]; n = 2; temp = movsum(A, [n-1 0], 1); B = temp(n:n:end, :);
结果会包含最后一组仅1行的求和:
B = 4 6 12 14 20 22 13 14
列向量非整数倍场景
v = [1;3;5;7;9;11;13]; n = 2; temp = movsum(v, [n-1 0], 1); B_v = temp(n:n:end);
结果:
B_v = 4 12 20 13
内容的提问来源于stack exchange,提问作者the_wicked
相关产品推荐
相关产品推荐

