有没有一种更有效的方法来在Matlab中执行多个嵌套的for循环?

时间:2019-04-05 07:02:40

标签: matlab performance for-loop nested-loops

我有一个小型逻辑数组(A),大小为256x256x256,数组中某处的形状未知。还有一个较小的双精度数组(se),大小为13x13x13。在本质上,在数组(se)的中间有一个已定义的逻辑立方体。

我需要遍历A中的每个逻辑元素,对于A中的每个逻辑元素,较小的数组se需要将其元素添加到A中。意思是将A的形状除以se

这是我到目前为止所得到的。它可以工作,但是在速度方面却表现很差。

有人建议如何加快编码速度吗?

[p, q, r] = size(se);
[m, n, o] = size(A);

temp = zeros(m, n, o);
for i = 1:m
    for j = 1:n
        for k = 1:o
            if img_g(i, j, k) == 1
                for s = 1:p
                    for t = 1:q
                        for u = 1:r
                            if se(s, t, u) == 1
                                c = i + s;
                                d = j + t;
                                e = k + u;
                                temp(c, d, e) = 1;
                            end
                        end
                    end
                end
            end
        end
    end
end
B = temp;

我非常感谢能够提高我的编程技能的任何帮助和建议。

2 个答案:

答案 0 :(得分:0)

取决于所使用的处理器,至少可以对外部循环(第一个循环)使用“ parfor”。 这样可以实现并行计算,并通过处理器获得的物理内核数量来提高性能。

答案 1 :(得分:0)

我不是100%肯定这会满足您的要求(因为我尚不完全清楚您的代码的作用),但也许该方法会给您一些启发。

我没有生成“逻辑” A,而是生成了一个随机的se,并且我在里面设置了一个等于1的立方体。与mask类似。我使用meshgrid获取与索引相对应的数组,并使用mask进行逻辑索引。 (也许我的A首先就是A = rand(255,255,255); A(40:50, 23:33, 80:100) = 1; mask = (A==1); [I,J,K] = meshgrid(1:255); se = rand(13,13,13); se(4:6, 3:7, 2:8) = 1; se_mask = (se==1); [se_I, se_J, se_K] = meshgrid(1:13); 的东西?)

A

在这里,我假设c中的立方体距离任意边都足够远(例如13个空格),因此我们不会将demask变大大于255。

我已经将find展平为行向量,因此ii给出了一个索引A,我们可以使用它来引用i中的任何点,然后是原始{ {1}},jk索引分别在I(ii)J(ii)K(ii)中。与se_I等类似。

temp = zeros(255, 255, 255);
for ii=find(mask(:).')
  for jj=find(se_mask(:).')
    c = I(ii) + se_I(jj);
    d = J(ii) + se_J(jj);
    e = K(ii) + se_K(jj);
    temp(c,d,e) = 1;
  end % for
end % for

矩阵IJKse_Ise_Jse_K是规则的,因此如果将它们存储起来您可以编写函数来替换它们的瓶颈。矩阵temp可能非常稀疏,具体取决于立方体的大小,因此您可以考虑使用sparse

我没有将时间与您的解决方案进行比较。