【问题标题】:Indices of boundary elements 3D matrix边界元素的索引 3D 矩阵
【发布时间】: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


【解决方案1】:

您可以通过以下方式轻松完成:

  1. 创建一个边界为truefalse 的3D 数组,否则使用or (|)implicit expansion
  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;

【讨论】:

    猜你喜欢
    • 2012-11-16
    • 1970-01-01
    • 2021-04-12
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    • 2013-01-03
    • 1970-01-01
    相关资源
    最近更新 更多