#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