我正在尝试使用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 回答
交换尺寸不是
gradient
,而是其他一切......MATLAB将数组索引为
(row,column)
,数组大小的顺序与[height,width]
相同 .但是,每当任何函数的文档提到
x
和y
时,x
始终是水平的,而y
是垂直的 . 所以在某种程度上MATLAB索引为(y,x)
.修复代码的正确方法是:
个人意见:这非常令人困惑,我看到很多人因此而犯错,并且自己犯了很多错误 . 但它们在MATLAB文档中与此非常一致,使用(i,j)或(x,y)取决于所需的顺序 - 除了ndgrid,其中文档使用x1,x2,x3,...但应该真的使用不同的字母 .