不使用循环对数组的特定元素求和
6次浏览(过去30天)
显示旧的注释
我想对一个数组的特定元素求和,但我想避免循环(如果可能的话)。
让我们假设我想创建一个1x10数组(下面代码中的“res”数组),它将存储零元素和在“inds”数组中描述的指示器中的“A”数组的特定元素的总和。
例如,我想实现res(1) = 0, res(2) = sum(A(1:7)), res(3) = 0, res(4) = sum(A(8:15))等,其中值“1”,“7”,“8”和“15”分别存储在数组“S”和“E”中。
有没有一种方法来实现这一点,避免循环,因为我尝试在下面的代码。
非常感谢。
= [1, 0, 0, 0, 0; 1; 1; 1; 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0);% 30x1阵列
Res = 0 (1,10);
S = [1 8 16 27];
E = [7 15 26 30];
Inds = [2 4 7 10];
I = 1:长度(inds);% -“向量化”方法
res(inds(i)) = sum(A(S(i):E(i)));%不会给出正确的结果
为j = 1:长度(第1)% -经典循环,i
res(inds(j)) = sum(A(S(j):E(j)));%想避免
结束
接受的答案
马修•诺伊
2021年10月14日
你好亚历克斯
试试这个
= [1, 0, 0, 0, 0; 1; 1; 1; 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0);% 30x1阵列
抽搐
Res = 0 (1,10);
S = [1 8 16 27];
E = [7 15 26 30];
Inds = [2 4 7 10];
方法1
为j = 1:长度(第1)% -经典循环,i
res(inds(j)) = sum(A(S(j):E(j)));%想避免
结束
toc
%方法二
更好的解决方案是:
抽搐
Res2 = 0 (1,10);
cA = cumsum(A);
tmp = cA(E);
tmp2 = [tmp (1);diff (tmp)];
Res2 (inds) = tmp2';
toc
结果比较:
res =
0 3 0 3 0 0 4 0 0 1
运行时间为0.001069秒。
它=
0 3 0 3 0 0 4 0 0 1
运行时间为0.000577秒。