【发布时间】:2016-08-25 14:12:30
【问题描述】:
所以我的问题是,我想在没有 for 循环的情况下执行此操作。获取多个向量但长度不同的 prod()。
我正在处理与体素相交的光线。我通常有 1e6 个射线和 1e5 个体素,但这可能会有所不同。
intxRays 是与体素相交的光线列表。
gainList 是一个一维向量,每个元素都有一个值,对应于之前计算的特定射线体素交点(实际上是在你可爱的很多 here 的帮助下)。
rayIntxStart 和 rayIntxEnd 是索引的向量,在 gainlist 数组中,每条射线的对应值开始和结束(它们都是按顺序排列的)。
这是代码和一些示例以及预期的输出。
gainSum = zeros(1, 5);
% only interested in the intx uniques
intxSegCtr = 1;
% loop through all of the unique segments
for rayCtr = 1:max(intxRays)
if rayCtr == intxRays(intxSegCtr)
startInd = rayIntxStart(intxSegCtr);
endInd = rayIntxEnd(intxSegCtr);
% find which rows correspoond to those segements
gainVals = gainList(startInd:endInd);
gainProd = prod(gainVals);
% get the product of the gains for those voxels
gainSumIdx = intxRays(intxSegCtr);
gainSum(gainSumIdx) = gainProd;
% increment counter
intxSegCtr = intxSegCtr + 1;
end
end
五条射线和九个体素的示例数据。假设体素增益数组对于九个体素(在上一步中使用)看起来像这样(为简单起见)。
voxelGains = 10:10:90;
现在假设光线 1 和 3 不击中任何物体,光线 2 击中体素 1 和 2,光线 4 击中体素 2:7 并且射线 5 击中体素 6:9
intxRays = [2, 4, 5];
gainList = [10, 20, 20, 30, 40, 50, 60, 70, 60 70, 80, 90];
rayIntxStart = [1, 3, 9];
rayIntxEnd = [2, 8, 12];
对于这些数字,上面的代码会给出结果:
gainSum = [0, 200, 0, 5.0400e+09, 3.024e+07];
我希望这一切都有意义。
当我开发它时,我使用的光线和体素数要小得多,而且效果很好。不过,当我向上移动时,我的代码中的主要瓶颈是这个循环。实际上,仅 gainVals 和 gainProd 分配就占了我运行时间的 80% 和 15%。
这是我能找到的唯一可行的方法,填充等由于涉及的尺寸而不起作用。
有没有办法在没有这个循环的情况下获得我想要的值?
非常感谢!
【问题讨论】:
-
您的代码没有给出显示的输出,也没有实际工作。是否正确: SegCtr 可能是 intxSegCtr ; length(intxRays) 应该是 max(intxRays) 并且 intxSegCtr = intxSegCtr + 1;应该在循环的末尾?我觉得它应该可以正常工作
-
很抱歉离开了。这是实际代码的一个非常简化的版本,所以很有可能我翻译错了。我会再看一遍并更新。谢谢。
-
@Finn 已更新,感谢您发现!
-
wb!有几种方法可以简化该循环,甚至更多。此示例中的给定向量是否通过循环在其他地方计算?
-
谢谢! intxRays 和 gainList 都是在其他函数中根据从外部光线追踪器(本例中为 Zemax)提取的数据计算得出的。
标签: matlab for-loop optimization vectorization