matlab - 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 才能使函数工作......
解决方案
不是gradient
交换维度,而是其他一切……
MATLAB 将数组索引为(row,column)
,并且数组大小以与 相同的顺序给出[height,width]
。
但是,只要任何函数的文档提到x
and y
,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,...
但实际上应该使用不同的字母。
推荐阅读
- python - Repl.it 环境秘密变量是 None 类型
- java - 为什么我需要添加双引号来打印java中char数组的第一个和最后一个元素
- javascript - 如何创建一次 p 元素函数并在每个函数中使用它以在屏幕上打印
- amazon-web-services - 用于多个项目的 Terraform 和 Gitlab CI 管道
- java - 在 Java 中复制 OPENSSL dgst 命令
- java - 如何创建一个 flink https 请求
- javascript - Date.toLocaleString('en-US', {hour12: false}) 将午夜提供为 24
- javascript - 关于切换 CSS 属性(即动画)的执行顺序问题
- python - Python 包和包含模块的文件夹有什么区别?
- model-view-controller - 使用 apache poi spring mvc 导出 Excel