首页 文章

MATLAB“渐变”功能交换x和y尺寸?

提问于
浏览
3

我正在尝试使用MATLAB(版本2016a)计算3-D矩阵的梯度 . 如果我输入“帮助渐变”,则说明如下:

“HX和HY可以是标量来指定坐标或向量之间的间距来指定点的坐标 . 如果HX和HY是向量, their length must match the corresponding dimension of F . ” (强调我的) .

这是一个示例代码:

x = 1:30; nx = length(x);
y = 1:62; ny = length(y);
z = 1:23; nz = length(z);

F = rand(nx,ny,nz);

[FX,FY,FZ] = gradient(F,x,y,z);

在这里,我输入向量x,y和z来计算梯度 . 这些是矢量,它在帮助中说HX和HY必须具有与F的相应尺寸匹配的长度.F的x维度具有长度nx . 所以x向量也有长度nx . 根据帮助,它应该工作 .

但是,我收到一个错误:

Index exceeds matrix dimensions.

Error in gradient (line 112)
            h = h(3:n) - h(1:n-2);

当我深入研究“渐变”函数时,我在“parse_inputs”嵌入函数中遇到了这一行:

% Swap 1 and 2 since x is the second dimension and y is the first.
loc = v;
if ndim > 1
    loc(2:-1:1) = loc(1:2);
end

这里发生了什么?

为什么MATLAB交换x和y尺寸?

如果我执行以下代码并交换x和y向量,则代码可以正常工作 .

x = 1:30; nx = length(x);
y = 1:62; ny = length(y);
z = 1:23; nz = length(z);

F = rand(nx,ny,nz);

[FX,FY,FZ] = gradient(F,y,x,z);

我只是不明白为什么 . 我已经查看了堆栈溢出但无法找到问题的任何答案 .

在任何情况下,似乎帮助有点误导,因为你实际上需要交换x和y来使函数工作...

1 回答

  • 3

    交换尺寸不是 gradient ,而是其他一切......

    MATLAB将数组索引为 (row,column) ,数组大小的顺序与 [height,width] 相同 .

    但是,每当任何函数的文档提到 xy 时, x 始终是水平的,而 y 是垂直的 . 所以在某种程度上MATLAB索引为 (y,x) .

    修复代码的正确方法是:

    x = 1:30; nx = length(x);
    y = 1:62; ny = length(y);
    z = 1:23; nz = length(z);
    
    F = rand(ny,nx,nz);   % <<< Note the order here!
    
    [FX,FY,FZ] = gradient(F,x,y,z);
    

    个人意见:这非常令人困惑,我看到很多人因此而犯错,并且自己犯了很多错误 . 但它们在MATLAB文档中与此非常一致,使用(i,j)或(x,y)取决于所需的顺序 - 除了ndgrid,其中文档使用x1,x2,x3,...但应该真的使用不同的字母 .

相关问题