代码之家  ›  专栏  ›  技术社区  ›  zlon

将一维数组重塑为网格网格格式

  •  1
  • zlon  · 技术社区  · 6 年前

    我有数据 x 我是说, y , z v ,按列向量组织。可通过以下代码获得类似数据:

    N = 5;
    [xf,yf,zf,vf] = flow(N);
    ux = unique(xf);
    uy = unique(yf);
    uz = unique(zf);
    
    x = nan(numel(xf),1);
    y = nan(numel(yf),1);
    z = nan(numel(zf),1);
    v = nan(numel(vf),1);
    iCount = 1;
    for iX = 1:numel(ux)
        for iY = 1:numel(uy)
            for iZ = 1:numel(uz)
                x(iCount) = ux(iX);
                y(iCount) = uy(iY);
                z(iCount) = uz(iZ);
                v(iCount) = vf((xf == x(iCount))&(yf == y(iCount))&(zf == z(iCount)));
                iCount = iCount+1;
            end
        end
    end
    

    我无法改变数据生成的方式,因此需要对其进行重新调整,以便以后使用 isosurface() griddedInterpolant() 稍后。原始数据的大小相当大,我希望避免循环。 简单使用 reshape() 功能:

    X = reshape(x,[N,2*N,N]);
    Y = reshape(y,[N,2*N,N]);
    Z = reshape(z,[N,2*N,N]);
    V = reshape(v,[N,2*N,N]);
    isosurface(X,Y,Z,V,-3)
    

    给我看,那个 Input grid is not a valid MESHGRID.

    你能帮助我以适当的方式重塑数据吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Andras Deak -- Слава Україні    6 年前

    数组中项目的顺序与来自的列主顺序不匹配 meshgrid .你已经差不多完成了,但是你需要用不同的形状重塑你的1D数组,然后将结果转换回你需要的实际形状:

    N = 5;
    [xf,yf,zf,vf] = flow(N);
    ux = unique(xf);
    uy = unique(yf);
    uz = unique(zf);
    
    x = nan(numel(xf),1);
    y = nan(numel(yf),1);
    z = nan(numel(zf),1);
    v = nan(numel(vf),1);
    iCount = 1;
    for iX = 1:numel(ux)
        for iY = 1:numel(uy)
            for iZ = 1:numel(uz)
                x(iCount) = ux(iX);
                y(iCount) = uy(iY);
                z(iCount) = uz(iZ);
                v(iCount) = vf((xf == x(iCount))&(yf == y(iCount))&(zf == z(iCount)));
                iCount = iCount+1;
            end
        end
    end
    
    % new stuff starts here
    X = permute(reshape(x,[N,N,2*N]),[2,3,1]);
    Y = permute(reshape(y,[N,N,2*N]),[2,3,1]);
    Z = permute(reshape(z,[N,N,2*N]),[2,3,1]);
    V = permute(reshape(v,[N,N,2*N]),[2,3,1]);
    
    % check equivalence
    isequal(X,xf)
    isequal(Y,yf)
    isequal(Z,zf)
    isequal(V,vf)
    

    上面的内容表明输入数组被复制(我们得到了四个逻辑数组 1 S)。

    注意,您的测试用例应该更加不对称,因为现在一些输入数组是彼此的转置,并且三维中的两个具有相同的大小。如果你的测试尺寸不对称,即 [N,M,K] ,更容易找出可能的歧义,因为在这种情况下,所有维度都是不等价的:

    N = 2; M = 3; K = 4;
    [xf,yf,zf] = meshgrid(1:N,1:M,1:K);
    vf = flow(xf,yf,zf);
    
    ux = unique(xf);
    uy = unique(yf);
    uz = unique(zf);
    
    x = nan(numel(xf),1);
    y = nan(numel(yf),1);
    z = nan(numel(zf),1);
    v = nan(numel(vf),1);
    iCount = 1;
    for iX = 1:numel(ux)
        for iY = 1:numel(uy)
            for iZ = 1:numel(uz)
                x(iCount) = ux(iX);
                y(iCount) = uy(iY);
                z(iCount) = uz(iZ);
                v(iCount) = vf((xf == x(iCount))&(yf == y(iCount))&(zf == z(iCount)));
                iCount = iCount+1;
            end
        end
    end
    
    X = permute(reshape(x,[K,M,N]),[2,3,1]);
    Y = permute(reshape(y,[K,M,N]),[2,3,1]);
    Z = permute(reshape(z,[K,M,N]),[2,3,1]);
    V = permute(reshape(v,[K,M,N]),[2,3,1]);
    
    % check equivalence
    isequal(X,xf)
    isequal(Y,yf)
    isequal(Z,zf)
    isequal(V,vf)