边界元素3D矩阵的指标

时间:2020-03-13 10:54:17

标签: arrays matlab multidimensional-array

我有一个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循环对我来说似乎有点多余。有没有更优化/更好/更清洁的方法来解决这个问题?

1 个答案:

答案 0 :(得分:1)

您可以轻松地按以下步骤进行操作:

  1. 使用or (|)implicit expansion将边界上的truefalse创建3D数组。
  2. 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;