Function 关于MatLab中函数细微差别的一个问题

Function 关于MatLab中函数细微差别的一个问题,function,matlab,matrix,vector,Function,Matlab,Matrix,Vector,当我运行这段代码时: 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); 在我的代码中,这段代码运行正常,通过ny矩阵输入nx,然后通过ny矩阵输出nx。但是,当我在完全相同的位置运行以

当我运行这段代码时:

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);
在我的代码中,这段代码运行正常,通过
ny
矩阵输入
nx
,然后通过
ny
矩阵输出
nx
。但是,当我在完全相同的位置运行以下代码时:

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
by
ny
输入,函数返回
nx-1
by
ny
矩阵

我无法理解为什么会发生这种情况。输出矩阵与应该的完全相同,只是最后一列和最后一行完全缺失。我的代码是迭代的,因此要求它们具有相同的大小,所以在解决这个问题之前,我无法继续


谢谢你的时间和帮助。你们是救生员。

在命令窗口中运行代码时,
phinew
已经存在。在您的命令窗口中,在粘贴这三行之前,请先清除phinew,您会发现
phinew
然后是
nx-1
,正如您从函数中得到的那样

如果要通过
ny
强制函数返回
nx
,请将
phinew=0(nx,ny)在函数的开头,或将最后一列和最后一行设置为所需的值

编辑:回答您的评论“为什么[主分配的RHS输出]一个48x48矩阵?在命令运行之前,phiold、phinew和POISONF都是50x50。”

我不认为
poissonf
是50x50:这会导致错误
矩阵维度必须一致
,因为
poissonf
被添加到表达式的其余部分,这是
phiold
的一部分,所以我将在下面忽略
poissonf

即使在第一次迭代中,RHS也总是通过nx-2
ny-2
。您可以通过将RHS分配给中间变量来看到这一点,例如
phipiece=…
并检查
size(phipiece)
。之所以
phinew
(如果重新创建)是49x49,是因为它被分配给
(2:ny-1,2:nx-1)
,这将通过
nx-1
矩阵创建
ny-1
,并将第一行和第一列保留为零


如果使用
phinew=0(nx,ny)首先,然后第一行和最后一行和列保留为零。

作为后续:你知道为什么在第二次迭代时(我的函数是递归的,每次都将大小减半)节
(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))
输出48x48矩阵?在命令运行之前,phiold、phinew和POISONF都是50x50See更新的答案。