【发布时间】:2020-03-13 10:54:17
【问题描述】:
我有一个 65x76x100 的 3D 矩阵,其中每个元素都包含一个材质类型。我已经为每个元素分配了动态,但是边界元素(或边界,或外部,或周长,或者你想怎么称呼它)的动态不正确,需要删除。我需要边框元素的所有线性索引,目前我这样做(并且有效):
materials; % given 65x76x100 3D-matrix;
[nxgrid, nygrid, nzgrid] = size(materials);
n = nxgrid*nygrid*nzgrid;
N2 = nxgrid*nygrid;
borderIndices = zeros(n, 1); % initialize an oversized matrix that contains the border indices
for l = 1:nzgrid % loop over zgrid
for k = 1:nygrid % loop over ygrid
for j = 1:nxgrid % loop over xgrid
if (j==1)||(j==nxgrid)||(k==1)||(k==nygrid)||(l==1)||(l==nzgrid)
i = (l-1)*N2 +(k-1)*nxgrid+j; % subscript to linear index
borderIndices(i) = i;
end
end
end
end
不过,那些嵌套的 for 循环对我来说似乎有点多余。有没有更优化/更好/更清洁的方法来解决这个问题?
【问题讨论】:
-
了解基本的 MATLAB 索引。一个立方体有 6 个面。您可以使用
materials(1,:,:)或其他materials(:,end,:)访问其中一个。您可以将它们删除为materials(1,:,:)=[]或将它们的值替换为materials(1,:,:)=0。在 MATLAB 中,如果您想在矩阵中操作,几乎没有理由拥有 3 个嵌套循环 -
当然可以,但正如我所问的,我想获得这些的线性指数。不是你所做的(只是删除边框元素)。同样,也许我遗漏了一些明显的东西,因为我认为这不是一个难题。但我现在有点卡住了,找不到解决方案。我知道几乎不需要嵌套 for 循环,这就是我问这个问题的原因。
-
你需要索引做什么?无论如何,使用相同的逻辑。一张脸将有 i=1,所有可能的 j 和所有可能的 k。您可以使用
meshgrid构建它。每个人脸索引需要 2 行代码,没有循环。尽管如此,它暗示您需要索引的方法很糟糕,并且您无法解决索引中遇到的任何问题
标签: arrays matlab multidimensional-array