Я пытаюсь вычислить градиент трехмерной матрицы с помощью MATLAB (версия 2016a). Если я наберу «справка градиента», он скажет следующее:
"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. X-размерность F имеет длину 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, чтобы функция заработала...