我有一个大小为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;
我非常感谢能够提高编程技能的任何帮助和建议。
取决于您正在使用的处理器,您至少可以使用“parfor”作为外部循环(第一个循环)。这可以实现并行计算,并通过处理器获得的物理内核数量来加速您的性能。
我不是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的c
,d
或e
。
我把mask
变成了一个行向量,所以find
给出一个单指数ii
,我们可以用它来指代A
中的任何一点,然后原始的i
,j
和k
指数分别在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
矩阵I
,J
,K
,se_I
,se_J
和se_K
是常规的,所以如果制作/存储它们成为瓶颈,你可以编写函数来替换它们。矩阵temp
可能非常稀疏,具体取决于你的立方体的大小,所以你可以考虑使用sparse
。
我没有将时间与您的解决方案进行比较。