我有一个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循环对我来说似乎有点多余。有没有更优化/更好/更清洁的方法来解决这个问题?
您可以按照以下方式轻松完成:
- 使用带隐式展开的
or (|)
创建一个边界上有true
、边界上没有false
的3D阵列 - 将
find
应用于一个输出以获得其线性索引
indices = find([1; zeros(size(materials,1)-2,1); 1] | ...
[1, zeros(1,size(materials,2)-2), 1] | ...
reshape([1, zeros(1,size(materials,3)-2), 1], 1, 1, []));
如果你想要代码中的结果(索引之间有零(:
indices_with_zeros(indices) = indices;