不使用循环对数组的特定元素求和

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)));%想避免
结束
2的评论
亚历克斯·P
亚历克斯·P 2021年10月14日
我发布的代码是一个简单的例子。事实上,在循环内部,除了求和计算之外,我想做矩阵乘法等计算,所以我认为向量化循环会更快。

登录评论。

接受的答案

马修•诺伊
马修•诺伊 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秒。

更多答案(0)

类别

了解更多循环和条件语句帮助中心而且文件交换

标签

s manbetx 845


释放

R2021b

社区寻宝

在MATLAB Central中找到宝藏,并发现社区如何帮助您!

开始狩猎!