我有一个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循环对我来说似乎有点多余。有没有更优化/更好/更清洁的方法来解决这个问题?
答案 0 :(得分:1)
您可以轻松地按以下步骤进行操作:
or (|)
和implicit expansion将边界上的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;