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
byny
输入,函数返回nx-1
byny
矩阵
我无法理解为什么会发生这种情况。输出矩阵与应该的完全相同,只是最后一列和最后一行完全缺失。我的代码是迭代的,因此要求它们具有相同的大小,所以在解决这个问题之前,我无法继续
谢谢你的时间和帮助。你们是救生员。在命令窗口中运行代码时,
phinew
已经存在。在您的命令窗口中,在粘贴这三行之前,请先清除phinew,您会发现phinew
然后是nx-1
,正如您从函数中得到的那样
如果要通过ny
强制函数返回nx
,请将phinew=0(nx,ny)代码>在函数的开头,或将最后一列和最后一行设置为所需的值
编辑:回答您的评论“为什么[主分配的RHS输出]一个48x48矩阵?在命令运行之前,phiold、phinew和POISONF都是50x50。”
我不认为poissonf
是50x50:这会导致错误矩阵维度必须一致
,因为poissonf
被添加到表达式的其余部分,这是phiold
的一部分,所以我将在下面忽略poissonf
即使在第一次迭代中,RHS也总是通过nx-2ny-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更新的答案。