在一件让我花了几个小时的事情中,我发现了MatLab处理维度的不一致之处。如果有人可以向我解释或告诉我如何向MatLab报告这一点,请给我启发。
对于size
、ones
、zeros
、mean
、std
和几乎所有其他存在于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
然而,对于stream3
、streamline
等依赖于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);
如果有人能解释为什么会发生这种情况,并能告诉我为什么这不是一个错误,欢迎。
2条答案
按热度按时间2j4z5cfb1#
此行为不是错误,因为它被清楚地记录为预期的行为:https://www.mathworks.com/help/matlab/ref/meshgrid.html。具体地说,就是:
[
X
、Y
、Z
]= meshgrid(
x
、y
、z
)
返回由矢量x
、y
和z
定义的三维栅格坐标。由X
、Y
和Z
表示的栅格的大小为length(y)
×length(x)
×length(z)
。在没有与原始作者交谈的情况下,确切的动机可能有点模糊,但我怀疑这与y轴通常与图像的行相关,而x是列的事实有关。
1aaf6o9v2#
在文档中,列是“j”或“x”,行是“i”或“y”。
有些函数处理空间坐标。文档将引用“x,y,z”。因此,这些函数将行值之前的列值作为输入参数。
有些函数处理数组索引。文档将引用“i,j”(或者有时引用“i1,i2,i3,...,in”,或者在维度编号前使用特定名称而不是“i”)。因此,这些函数将把列值之前的行值作为输入参数。
是的,这可能会令人困惑。但是,如果您注意文档中变量的名称,您很快就会找出正确的顺序。
尤其是
meshgrid
,如果“x,y,...”参数的顺序很混乱,请改用ndgrid
,它以数组索引顺序接受参数。