转换'为'循环条件到矩阵乘法

时间:2016-07-12 09:51:53

标签: matlab

我目前正在使用嵌套式' 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

1 个答案:

答案 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循环,它不会使您的代码线性化。