【问题标题】:How to avoid for loops in this code to improve computation time如何避免此代码中的 for 循环以缩短计算时间
【发布时间】:2017-02-03 22:28:48
【问题描述】:

在这段代码中,我有一个包含 10 个类的集群图像,我想为每个级别提取 10 个不同的图像并保存为 10 个图像 下面是我使用的代码

tic
numberOfClasses = 10;
segment_label_images = cell(1,numberOfClasses);
pixelCount = zeros(1,numberOfClasses);
[rs, cs] = size(classImage);
% classImage has intensity range from 1-numberOfClasses
for k = 1:numberOfClasses
    for i = 1:rs
        for j = 1:cs
            if classImage(i,j) == k
                segment_label_images{k}(i,j) = 1;
            else
                segment_label_images{k}(i,j) = 0;
            end
        end
    end
pixelCount(k) = sum(segment_label_images{k}(:));
%figure, imshow(segment_label_images{k},[]);
end
toc

在这里,我有 3 个 for 循环,我认为这会影响计算时间。经过的时间是 0.089413 秒。

有什么建议可以避免使用 for 循环来缩短压缩时间。?谢谢,Gopi

【问题讨论】:

  • 为了性能,不要使用元胞数组。对灰度图像使用 3D 数组 IMG(i,j,N)。

标签: matlab performance


【解决方案1】:

假设 classImage 是一个矩阵,您可以使用它来加速它

for k = 1:numberOfClasses
    segment_label_images{k} = classImage == k;
    pixelCount(k) = sum(segment_label_images{k}(:));
end

【讨论】:

  • 感谢faultr,它工作得非常快,计算速度提高了3-4倍。是的,classImage 是一个矩阵
【解决方案2】:

假设 MATLAB 2016b(或 Octave):

k = permute(1:numberOfClasses, [1,3,2]);
segment_label_images = (classImage == k);
pixelCount = squeeze(sum(sum(segment_label_images, 1), 2));

对于 pre-2016b MATLAB,只需添加 bsxfun:

k = permute(1:numberOfClasses, [1,3,2]);
segment_label_images = bsxfun(@eq, classImage, k);
pixelCount = squeeze(sum(sum(segment_label_images, 1), 2));

当然,这两个都将segment_label_images 保留为 3D 数组而不是元胞数组。鉴于所有数组的大小相同,为了速度和方便,我更喜欢使用多维数组而不是元胞数组。如果需要,当然可以将其转换为元胞数组。

【讨论】:

    猜你喜欢
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    相关资源
    最近更新 更多