【问题标题】:MATLAB "gradient" function swaps x and y dimensions?MATLAB“梯度”函数交换x和y维度?
【发布时间】:2018-10-11 17:23:21
【问题描述】:

我正在尝试使用 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 才能使函数工作......

【问题讨论】:

标签: matlab input gradient


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    • 1970-01-01
    • 2021-02-22
    • 2021-12-18
    相关资源
    最近更新 更多