【问题标题】:A question regarding the nuances of functions within MatLab关于 MatLab 中函数细微差别的问题
【发布时间】:2020-11-30 20:58:34
【问题描述】:

当我运行这段代码时:

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 by ny 矩阵并输出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 by ny 输入返回一个nx-1 by ny-1 矩阵。

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

感谢您的宝贵时间和帮助。你们是救生员。

【问题讨论】:

    标签: function matlab matrix vector


    【解决方案1】:

    当您在命令窗口中运行代码时,phinew 已经存在。在您的命令窗口中,在粘贴这三行之前执行clear phinew,然后您会发现phinewnx-1ny-1,正如您从函数中获得的那样。

    如果您想通过ny 强制您的函数返回nx,请将phinew = zeros(nx,ny); 放在函数的开头,或者将最后一列和最后一行设置为您想要的任何值。

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

    我不认为 poissonf 是 50x50:这会导致错误 Matrix dimensions must agree,因为 poissonf 被添加到作为 phiold 一部分的表达式的其余部分,所以我将忽略poissonf 在下面。

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

    如果您首先使用phinew = zeros(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 和 poissonf 都是 50x50
    猜你喜欢
    • 2019-09-30
    • 2015-03-19
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    相关资源
    最近更新 更多