【问题标题】:Recursion in Matlab. why is my recursion not working past the first step?Matlab中的递归。为什么我的递归无法通过第一步?
【发布时间】:2026-01-28 17:30:01
【问题描述】:

所以我是 Matlab 的新手,我的任务是实现 LU 分解。我必须递归地这样做,因为我们不允许在代码中使用 for 循环,递归会给我们最佳标记。我已经写了这段代码。该代码适用于第一步,并按预期执行,但在接下来的两个步骤中,矩阵根本没有修改。我有这个代码:

function[L, U] = myLU(A,B, pos)
%A = Mtrix that becomes U
%B = Matrix that becomes L
    tmp_L = B;
    [x,y] = size(A);
    if pos > x
        L = B; 
        U = A;
        return
    else
       pos %<-- just to see if it iterates through everything
       [tmp_U,tmp_L] = elimMat(A,pos);
       myLU(tmp_U,tmp_L, pos+1);
    end
    L = tmp_L; 
    U = tmp_U;
end

I 其中elimMat(A, pos) 返回列 pos 的消除矩阵。以及另一个矩阵,最终将成为乘数矩阵。然后我尝试做的是找到这个矩阵A 的 LU 分解。由于 elimMat 返回 L 和 U(这有效,如果我手动执行它就有效),我必须创建一个函数,允许我在不使用 for 循环的情况下自动执行它。我以为我会递归地做。我最终做的是在函数中添加另一个变量B,以便我可以存储在每个步骤中获得的矩阵的中间值,然后将它们放在一起。

所以这是我的问题。我执行递归错误吗?如果我是,我该如何解决?我想问的另一件事是如何实现这一点,所以我不需要变量B 作为额外的输入,而只使用现有变量或先前定义的变量来找到解决方案?我真的希望我的函数中只有两个输入:矩阵名称和起始索引。

如果有帮助,这里是elimMat

function [M,L] = elimMat(A,k)
    %find the size of the matrix
    [x,y] = size(A);
    tmp_mat = zeros(x,y);
    %M = The current matrix we are working on for Elimination -> going to
    %become U.
    %L = The L part of the matrix we are working on.  Contains all the
    %multipliers. This is going to be our L matrix.
    for i = 1:x
        mult = A(i,k)/A(k,k);
        if i > k            
            tmp_mat(i,k) = mult;
            P = A(k,:)*mult;
            A(i,:) = A(i,:)-P;
        elseif i == k
            tmp_mat(k,k) = 1;
        end
    end
    M = A;
    L = tmp_mat;
end

感谢您提供的任何反馈。

这里是输出:我得到了什么 VS 它应该是什么:

[U =                    VS           [U = 

 1     2     2                        1   2   2
 0    -4    -6                        0  -4  -6
 0    -2    -4]                       0   0   2

L =                         VS       [L= 

 1     0     0                        1   0   0
 4     0     0                        4   1   0 
 4     0     0]                       4  0.5  1

如您所见,只有第一列发生了变化

【问题讨论】:

  • 关于你的第一个代码块:如果你使用基于缩进的代码格式,你不需要写反引号。尽管 SO 中缺少正确的 matlab 语法突出显示,但您的第一个块这样更糟:) elimMat 开头的 cmets 可能会令人困惑:函数头之后的函数的第一条连续注释行是它的帮助。如果您键入help elimMat,您应该会看到代码的第一个 cmets。为避免这种情况,请在函数标题后留一个空行(至少我认为应该可以解决它。要么这样,要么在标题后放一个空注释)。
  • 感谢您的反馈。一旦我的代码开始工作,我会考虑进行这些更改。

标签: matlab recursion matrix


【解决方案1】:

您忘记捕获递归调用的输出:

[tmp_L, tmp_U] = myLU(tmp_U,tmp_L, pos+1);

Matlab 按值传递变量,因此函数本身不能更改其输入变量(好吧,它可以,但它很棘手且不安全)。

你的原始版本没有返回更新后的矩阵,所以最外层的函数调用遇到了myLU()调用,让递归展开并结束,然后继续使用从返回的tmp_Ltmp_U第一次打电话给elimMAT(A,1)

请注意,您可能希望标准化您的函数,以便它们以相同的顺序返回 UL,以避免混淆。

【讨论】:

  • 感谢您的回答。我不敢相信我忽略了结果分配。这适用于第一部分。并且 U 正确出现。但是,我仍然有 L 的问题。你知道如何解决我遇到的另一个问题吗?我想从函数调用中删除 tmp_L 并让它还给我 L?
  • 等待 nvm。我只是没有在函数中传递它。这可以解释为什么它不起作用。
  • @MD-4 我不完全理解问题所在,但您的第二个推荐告诉我可能根本没有问题。如果还有什么,请告诉我:)
  • 哈哈对不起。我的一个矩阵添加不正确时遇到问题。我解决了这个问题。我只是忘了添加,
  • 感谢您的回答。我已经离开电脑一段时间了。