Вопрос, касающийся нюансов функций в MatLab

#function #matlab #matrix #vector

#функция #matlab #матрица #вектор

Вопрос:

Когда я запускаю этот фрагмент кода:

 dx = 4/(nx-1);
dy = 2/(ny-1);
phinew(2:ny-1,2:nx-1) = ((dy^2*(phiold(1:ny-2,2:nx-1) phiold(3:ny,2:nx-1)) dx^2*(phiold(2:ny-1,1:nx-2) phiold(2:ny-1,3:nx)))/(2*(dx^2 dy^2))-poissonf);
 

В моем коде фрагмент кода работает корректно, принимая входные nx ny данные матрицы by и выводя матрицу nx by ny . Однако, когда я запускаю следующий код в точно такой же позиции:

 phinew = Smoothing(phiold,poissonf,nx,ny)
 

Где функция «Сглаживание» определяется как:

 function [phinew,dx,dy] = Smoothing(phiold,poissonf,nx,ny)
        dx = 4/(nx-1);
        dy = 2/(ny-1);
        phinew(2:ny-1,2:nx-1) = ((dy^2*(phiold(1:ny-2,2:nx-1) phiold(3:ny,2:nx-1)) dx^2*(phiold(2:ny-1,1:nx-2) phiold(2:ny-1,3:nx)))/(2*(dx^2 dy^2))-poissonf);
end
 

Функция возвращает матрицу nx-1 by ny-1 для nx ny ввода by.

Я не могу взять в толк, почему это вообще происходит. Выходная матрица точно такая же, какой она должна быть, за исключением того, что последний столбец и строка полностью отсутствуют. Мой код является итеративным и поэтому требует, чтобы они были одинакового размера, поэтому я не могу двигаться дальше, пока эта проблема не будет решена.

Спасибо вам за ваше время и вашу помощь. Вы, люди, спасаете жизни.

Ответ №1:

Когда вы запускаете свой код в окне командной строки, phinew он уже существует. В вашем окне командной строки выполните, clear phinew прежде чем вставлять эти три строки, и вы обнаружите, что phinew это то nx-1 ny-1 , что вы получаете от своей функции.

Если вы хотите заставить свою функцию возвращать nx by ny , поместите phinew = zeros(nx,ny); в начало функции или установите для последнего столбца и строки то, что вы хотите, чтобы они были.

РЕДАКТИРОВАТЬ: отвечая на ваш комментарий «почему [RHS основного назначения выводит] матрицу 48×48? Непосредственно перед запуском команды phiold, phinew и poissonf имеют размер 50×50. »

Я не думаю poissonf , что это 50×50: это приведет к ошибке Matrix dimensions must agree , потому poissonf что добавляется к остальной части выражения, которое является частью phiold , поэтому я буду игнорировать poissonf в следующем.

RHS всегда ny-2 выполняется nx-2 , даже на первой итерации. Вы можете увидеть это, присвоив RHS промежуточной переменной, например phipiece = ... , и проверив size(phipiece) . Причина phinew (если она создана заново) 49×49 заключается в том, что она назначена (2:ny-1,2:nx-1) , что создаст матрицу ny-1 by nx-1 и оставит первую строку и столбец равными нулю.

Если вы используете phinew = zeros(nx,ny); first , то первая и последняя строки и столбцы остаются равными нулю.

Комментарии:

1. В качестве продолжения: есть идеи относительно того, почему на второй итерации (моя функция рекурсивна и каждый раз уменьшает размер вдвое) раздел (dy^2*(phiold(1:ny-2,2:nx-1) phiold(3:ny,2:nx-1)) dx^2*(phiold(2:ny-1,1:nx-2) phiold(2:ny-1,3:nx)))/(2*(dx^2 dy^2)) выводит матрицу 48×48? Непосредственно перед запуском команды phiold, phinew и poissonf имеют размер 50×50