【发布时间】:2019-09-24 07:27:29
【问题描述】:
我有一个数组A=[a1,a2,a3, ..., aN] 我想取每3个元素的乘积:
s1=a1+a2+a3
s2=a4+a5+a6
...
sM=a(N-2)+a(N-1)+aN
我的解决方案:
k=size(A);
s=0;
for n=1:k
s(n)=s(n-2)+s(n-1)+s(n);
end
错误: 试图访问 s(2);索引超出范围,因为 numel(s)=1。
锄头来修复它?
【问题讨论】:
我有一个数组A=[a1,a2,a3, ..., aN] 我想取每3个元素的乘积:
s1=a1+a2+a3
s2=a4+a5+a6
...
sM=a(N-2)+a(N-1)+aN
我的解决方案:
k=size(A);
s=0;
for n=1:k
s(n)=s(n-2)+s(n-1)+s(n);
end
错误: 试图访问 s(2);索引超出范围,因为 numel(s)=1。
锄头来修复它?
【问题讨论】:
如果你想在blocks中求和,对于A的元素个数不一定是块大小的倍数的一般情况,你可以使用accumarray:
A = [3 8 5 8 2 3 4 7 9 6 4]; % 11 elements
s = 3; % block size
result = accumarray(ceil((1:numel(A))/s).', A(:));
如果你想要一个给定块大小的滑动和,你可以使用conv:
A = [3 8 5 8 2 3 4 7 9 6 4]; % 11 elements
s = 3; % block size
result = conv(A(:).', ones(1,s), 'valid');
【讨论】:
movsum函数计算滑动和,比卷积的方法直观一点。
您尝试使用来自s 的值来计算s。你不是说s(n)=A(n-2)+A(n-1)+A(n);吗?此外,size 本身会返回多个维度。
话虽如此,获取 2 个私有值 n-2 和 n-1 确实适用于 n=1;2(因为您必须有正索引)。您必须解释如何处理前两个值。我假设不存在的元素为 0
k=size(A,2); %only the second dimension when A 1xn, or length(A)
s=zeros(1,k); %get empty values instead of appending each value for better performance
s(1)=A(1);
s(2)=A(2)+A(1);
for n=3:k %start at 3
s(n)=A(n-2)+A(n-1)+A(n);
end
或s应该比A短2个值。
k=size(A,2);
s=zeros(1,k-2);
for n=1:k-2
s(n)=A(n)+A(n+1)+A(n+2);
end
【讨论】:
s 初始化为带有s = 0 的标量。然后你尝试像数组一样索引它,但它只有一个元素。您当前的逻辑(如果固定)将计算:
s(1) = a(1)+a(2)+a(3)
s(2) = a(2)+a(3)+a(4)
...
% 's' will be 2 elements shorter than 'a'
所以我们需要更明智地使用索引来获得您所描述的内容,即
s(1) = a(1)+a(2)+a(3)
s(2) = a(4)+a(5)+a(6)
...
% 's' will be a third as big as 'a'
您应该预先分配s 到正确的大小,如下所示:
k = numel(A); % Number of elements in 'A'
s = zeros( 1, k/3 ); % Output array, assuming 'k' is divisible by 3
for n = 0:3:k-3
s(n/3+1) = a(n+1) + a(n+2) + a(n+3);
end
您可以在一行中将数组重新整形为 3 行,然后对每一列求和,这假设 a 中的元素数可以被 3 整除,并且 a 是行向量...
s = sum( reshape( a, 3, [] ) );
【讨论】:
a 是行向量,是吗?
a 作为 N 维数组,a(1)... 是 M 维数组,M<N。