首页 > 解决方案 > 优化相邻点的总和 3D

问题描述

我有一个材料矩阵,其中的值表示材料的类型(值在 1 到 8 之间)。低于 5 的每个值都表示“有趣”的材料。现在在某一点上,我想总结一下不感兴趣的邻居材料的数量。因此,在 3D 矩阵中,某一点的结果可以是 0 到 6 之间的值。问题之一是“当前”点位于 3D 矩阵的边缘。我可以使用 3 个非常昂贵的 for 循环来解决这个问题:

materials; % given 3D matrix i.e. 97*87*100
matrixSize = size(materials);
n = matrixSize(1)*matrixSize(2)*matrixSize(3); * total number of points
materialsFlattened = reshape(materials, [n 1]); % flattened materials matrix from a 3D matrix to a 1D matrix
pageSize = matrixSize(1)*matrixSize(2); % size of a page in z-direction

interestingMaterials = materialsFlattened(:) < 5; % logical vector indicating if the materials are interesting

n_bc = zeros(obj.n, 1); % amount of neighbour non-interesting materials
for l = 1:matrixSize(3) % loop over all z
    for k = 1:matrixSize(2) % loop over all y
                for j = 1:matrixSize(1) % loop over all x
                    n_bc(sub2ind(matrixSize,j,k,l)) = ...
                        ~interestingMaterials(sub2ind(matrixSize,j,k,max(1, l-1)))...
                      + ~interestingMaterials(sub2ind(matrixSize,j,max(1,k-1),l))...
                      + ~interestingMaterials(sub2ind(matrixSize,max(1, j-1),k,l))...
                      + ~interestingMaterials(sub2ind(matrixSize,min(matrixSize(1),j+1),k,l))...
                      + ~interestingMaterials(sub2ind(matrixSize,j,min(matrixSize(2),k+1),l))...
                      + ~interestingMaterials(sub2ind(matrixSize,j,k,min(matrixSize(3),l+1)));
                end
            end
        end

所以请注意,我首先使用重塑将矩阵展平为一维矩阵。minandmax运算符确保 i 不会超出矩阵的范围;相反,我采用我目前所在的材料的价值。对于我的应用程序,速度至关重要,我希望我可以摆脱循环结构中这个丑陋的循环。通常这在 MATLAB 中是可能的,因为元素索引是惊人的,有时有点神奇。

标签: matlab

解决方案


推荐阅读