我有一个小型逻辑数组(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;
我非常感谢能够提高我的编程技能的任何帮助和建议。
答案 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个空格),因此我们不会将d
,e
或mask
变大大于255。
我已经将find
展平为行向量,因此ii
给出了一个索引A
,我们可以使用它来引用i
中的任何点,然后是原始{ {1}},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
。
我没有将时间与您的解决方案进行比较。