MATLAB "градиент" функция меняет размеры х и у? - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь вычислить градиент трехмерной матрицы, используя 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, чтобы сделать функциюработа ...

1 Ответ

0 голосов
/ 11 октября 2018

Меняется не gradient, а все остальное ...

MATLAB индексирует массивы как (row,column), а размеры массивов задаются в том же порядке, что и [height,width].

Однако, когда в документации к любой функции упоминаются x и 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,..., но на самом деле следовало использовать другую букву.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...