有没有更有效的方法在matlab中执行多个嵌套for循环?

问题描述 投票:1回答:2

我有一个大小为256x256x256的小逻辑数组(A),在数组中某处有一个未知形状的数组。另外还有一个尺寸为13x13x13的小型双阵列(se)。实际上,在数组的中间有一个定义的逻辑1的立方体(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;

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

matlab performance for-loop nested-loops
2个回答
0
投票

取决于您正在使用的处理器,您至少可以使用“parfor”作为外部循环(第一个循环)。这可以实现并行计算,并通过处理器获得的物理内核数量来加速您的性能。


0
投票

我不是100%肯定这会做你所要求的(因为我不清楚你的代码做了什么),但也许这种方法会给你一些灵感。

我没有生成一个“逻辑”的A,而是一个随机的,我设置了一个等于1的立方体。类似于se。我使用meshgrid来获取与索引相对应的数组,并使用逻辑索引的mask。 (也许我的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中的立方体远离任何边缘(比如13个空格),所以我们不会得到大于255的cde

我把mask变成了一个行向量,所以find给出一个单指数ii,我们可以用它来指代A中的任何一点,然后原始的ijk指数分别在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

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

© www.soinside.com 2019 - 2024. All rights reserved.