我目前正在使用嵌套式' for'循环计算平均值。这是一个3527 * 256像素的图像,每个像素包含448个值。我希望将这些448值乘以名为' modis_rsr'(448 * 8)的数组,然后仅将零和正值相加。在那之后,我希望将这个总和除以' modis_rsr'的值的总和。仅对应于hyp_1nm中具有正值的那些。
正如您所料,这个序列耗时太长,我希望使用矩阵乘法来加快速度。我唯一不知道该怎么做的是包含' modis_rsr'的条件和。我在考虑创建一个引用数组来存储那些负数的索引。但这似乎也是计算密集型的。
for j = 1:8
for k = 1:256
for i = 1:3527
RLs = 0;
for jj = 1:448
if hyp_1nm(i,jj,k)>= 0
RLi = hyp_1nm(i,jj,k)*modis_rsr(jj,j);
RLs = RLs + RLi;
temp_rsr(jj,j) = modis_rsr(jj,j);
else
temp_rsr(jj,j) = 0;
end
end
Rs = sum(temp_rsr(1:448,j));
% Write basr
basr(i,j,k) = RLs/Rs;
end
end
end
答案 0 :(得分:2)
您无法使用matlab 在一个特定维度上对数组进行乘法运算,因此在这种情况下您无法避免使用循环。但是您可以通过使用逻辑索引和逐元素乘法来减少循环次数。
Set ws = Worksheets.Add
Sheets(ws.Name).Name = "Write-Off Pivot"
如果您真的要避免for循环,可以使用函数 for j = 1:8
for k = 1:256
for i = 1:3527
RLs = 0;
ind = hyp_1nm(i,:,k) >= 0; %by using the logical indexing you can avoid 1 loop.
RLs = sum(hyp_1nm(i,ind,k).*modis_rsr(ind,j)'); % .* = element-wise multiplication
temp_rsr(ind,j) = modis_rsr(ind,j);
temp_rsr(~ind,j) = 0;
Rs = sum(temp_rsr(1:448,j));
basr(i,j,k) = RLs/Rs;
end
end
end
,但bsxfun
只隐藏foor循环,它不会使您的代码线性化。