尽管必须单独检查每个元素,但如何避免这个 for 循环?
How can I avoid this for-loop in spite of every element having to be checked individually?
使用Matlab R2019a,有没有办法避免下面代码中的for循环,尽管维度包含不同的元素,所以每个元素都必须检查? M
是带有索引的向量,Inpts.payout
是带有数值数据的 5 维数组。
for m = 1:length(M)-1
for power = 1:noScenarios
for production = 1:noScenarios
for inflation = 1:noScenarios
for interest = 1:noScenarios
if Inpts.payout(M(m),power,production,inflation,interest)<0
Inpts.payout(M(m+1),power,production,inflation,interest)=...
Inpts.payout(M(m+1),power,production,inflation,interest)...
+Inpts.payout(M(m),power,production,inflation,interest);
Inpts.payout(M(m),power,production,inflation,interest)=0;
end
end
end
end
end
end
似乎没有办法避免这种情况。我假设每个 for lop 独立地更改主计算中使用的可变参数。因此,需要有这么多的 for 循环。如果您担心外观,我唯一的建议是将嵌套循环变成一个函数。不确定这是否有帮助 run-time。
去掉里面的4个循环很简单。除非你有一个巨大的矩阵Inpts.payout
,否则这会更有效,因为必须生成一个新的索引矩阵。
以下代码从输入数据中提取两个相关的'planes',对它们进行逻辑处理,然后将它们写回:
for m = 1:length(M)-1
payout_m = Inpts.payout(M(m),:,:,:,:);
payout_m1 = Inpts.payout(M(m+1),:,:,:,:);
indx = payout_m < 0;
payout_m1(indx) = payout_m1(indx) + payout_m(indx);
payout_m(indx) = 0;
Inpts.payout(M(m),:,:,:,:) = payout_m;
Inpts.payout(M(m+1),:,:,:,:) = payout_m1;
end
可以通过直接使用输入数据矩阵来避免提取 'planes' 并将它们写回。但是,这会产生更复杂的代码。
但是,我们可以通过这种方式轻松避免一些索引操作:
payout_m = Inpts.payout(M(1),:,:,:,:);
for m = 1:length(M)-1
payout_m1 = Inpts.payout(M(m+1),:,:,:,:);
indx = payout_m < 0;
payout_m1(indx) = payout_m1(indx) + payout_m(indx);
payout_m(indx) = 0;
Inpts.payout(M(m),:,:,:,:) = payout_m;
payout_m = payout_m1;
end
Inpts.payout(M(m+1),:,:,:,:) = payout_m1;
使用Matlab R2019a,有没有办法避免下面代码中的for循环,尽管维度包含不同的元素,所以每个元素都必须检查? M
是带有索引的向量,Inpts.payout
是带有数值数据的 5 维数组。
for m = 1:length(M)-1
for power = 1:noScenarios
for production = 1:noScenarios
for inflation = 1:noScenarios
for interest = 1:noScenarios
if Inpts.payout(M(m),power,production,inflation,interest)<0
Inpts.payout(M(m+1),power,production,inflation,interest)=...
Inpts.payout(M(m+1),power,production,inflation,interest)...
+Inpts.payout(M(m),power,production,inflation,interest);
Inpts.payout(M(m),power,production,inflation,interest)=0;
end
end
end
end
end
end
似乎没有办法避免这种情况。我假设每个 for lop 独立地更改主计算中使用的可变参数。因此,需要有这么多的 for 循环。如果您担心外观,我唯一的建议是将嵌套循环变成一个函数。不确定这是否有帮助 run-time。
去掉里面的4个循环很简单。除非你有一个巨大的矩阵Inpts.payout
,否则这会更有效,因为必须生成一个新的索引矩阵。
以下代码从输入数据中提取两个相关的'planes',对它们进行逻辑处理,然后将它们写回:
for m = 1:length(M)-1
payout_m = Inpts.payout(M(m),:,:,:,:);
payout_m1 = Inpts.payout(M(m+1),:,:,:,:);
indx = payout_m < 0;
payout_m1(indx) = payout_m1(indx) + payout_m(indx);
payout_m(indx) = 0;
Inpts.payout(M(m),:,:,:,:) = payout_m;
Inpts.payout(M(m+1),:,:,:,:) = payout_m1;
end
可以通过直接使用输入数据矩阵来避免提取 'planes' 并将它们写回。但是,这会产生更复杂的代码。
但是,我们可以通过这种方式轻松避免一些索引操作:
payout_m = Inpts.payout(M(1),:,:,:,:);
for m = 1:length(M)-1
payout_m1 = Inpts.payout(M(m+1),:,:,:,:);
indx = payout_m < 0;
payout_m1(indx) = payout_m1(indx) + payout_m(indx);
payout_m(indx) = 0;
Inpts.payout(M(m),:,:,:,:) = payout_m;
payout_m = payout_m1;
end
Inpts.payout(M(m+1),:,:,:,:) = payout_m1;