在网格中互换MatLab尺寸

tjrkku2a  于 2022-11-15  发布在  Matlab
关注(0)|答案(2)|浏览(196)

在一件让我花了几个小时的事情中,我发现了MatLab处理维度的不一致之处。如果有人可以向我解释或告诉我如何向MatLab报告这一点,请给我启发。
对于sizeoneszerosmeanstd和几乎所有其他存在于Matlab中的旧的和常见的命令,维度排列类似于经典的排列,并且类似于预期的标准(根据每个维度的size),第一个维度沿列向量,第二个维度沿行向量,下面是非图形化的以下索引。

>x(:,:,1)=[1 2 3 4;5 6 7 8];
>x(:,:,2)=[9 10 11 12;13 14 15 16];

>m=mean(x,1)
m(:,:,1) = 3     4     5     6
m(:,:,2) = 11    12    13    14

m=mean(x,2)
m(:,:,1) =
    2.5000
    6.5000
m(:,:,2) =
   10.5000
   14.5000

m=mean(x,3)
m =  5     6     7     8
     9    10    11    12

d=size(m)
d =  2     4     2

然而,对于stream3streamline等依赖于meshgrid输出格式的图形命令,维度1和2互换了!:第一个维度是行向量,第二个维度是列向量,下面(第三个)是非图形索引。

> [x,y]=meshgrid(1:2,1:3)
x =  1     2
     1     2
     1     2
y =  1     1
     2     2
     3     3

然后,为了让stream3对经典排列的矩阵进行运算,我们应该在每个3D参数中使用permute(XXX,[2 1 3])

xyz=stream3(permute(x,[2 1 3]),permute(y,[2 1 3]),permute(z,[2 1 3])...
    ,permute(u,[2 1 3]),permute(v,[2 1 3]),permute(w,[2 1 3])...
    ,xs,ys,zs);

如果有人能解释为什么会发生这种情况,并能告诉我为什么这不是一个错误,欢迎。

2j4z5cfb

2j4z5cfb1#

此行为不是错误,因为它被清楚地记录为预期的行为:https://www.mathworks.com/help/matlab/ref/meshgrid.html。具体地说,就是:
[XYZ]= meshgrid(xyz)返回由矢量xyz定义的三维栅格坐标。由XYZ表示的栅格的大小为length(y)×length(x)×length(z)
在没有与原始作者交谈的情况下,确切的动机可能有点模糊,但我怀疑这与y轴通常与图像的行相关,而x是列的事实有关。

1aaf6o9v

1aaf6o9v2#

在文档中,列是“j”或“x”,行是“i”或“y”。
有些函数处理空间坐标。文档将引用“x,y,z”。因此,这些函数将行值之前的列值作为输入参数。
有些函数处理数组索引。文档将引用“i,j”(或者有时引用“i1,i2,i3,...,in”,或者在维度编号前使用特定名称而不是“i”)。因此,这些函数将把列值之前的行值作为输入参数。
是的,这可能会令人困惑。但是,如果您注意文档中变量的名称,您很快就会找出正确的顺序。
尤其是meshgrid,如果“x,y,...”参数的顺序很混乱,请改用ndgrid,它以数组索引顺序接受参数。

相关问题