【问题标题】:How to find a sum 3 elements in array?如何在数组中找到总和 3 个元素?
【发布时间】: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。

锄头来修复它?

【问题讨论】:

    标签: arrays matlab sum element


    【解决方案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');
    

    【讨论】:

    • 从MATLAB R2016a开始,可以使用movsum函数计算滑动和,比卷积的方法直观一点。
    【解决方案2】:

    您尝试使用来自s 的值来计算s。你不是说s(n)=A(n-2)+A(n-1)+A(n);吗?此外,size 本身会返回多个维度。

    话虽如此,获取 2 个私有值 n-2n-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(1) 是 a1、a2 和 a3 的总和
    • 给定的数组有 N 个元素。我想在一行中计算总和
    【解决方案3】:
    • 您将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 是行向量,是吗?
    • @LuisMendo 我可能只是说“矢量”:)
    • @LuisMendo 我正在使用 a 作为 N 维数组,a(1)... 是 M 维数组,M<N
    • @Noel 在您的问题中根本没有提到,并且从根本上影响给定答案的效果...请始终包括代表minimal reproducible example 来表示您想要实现的目标
    猜你喜欢
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    • 2021-01-06
    • 2011-08-03
    相关资源
    最近更新 更多