首页 > 解决方案 > MATLAB“梯度”函数交换x和y维度?

问题描述

我正在尝试使用 MATLAB(2016a 版)计算 3-D 矩阵的梯度。如果我输入“帮助渐变”,它会显示以下内容:

HX 和 HY 可以是标量来指定坐标之间的间距,也可以是向量来指定点的坐标。如果 HX 和 HY 是向量,它们的长度必须与 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 才能使函数工作......

标签: matlabinputgradient

解决方案


不是gradient交换维度,而是其他一切……

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

但是,只要任何函数的文档提到xand yx总是水平和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,...但实际上应该使用不同的字母。


推荐阅读