【发布时间】: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。为避免这种情况,请在函数标题后留一个空行(至少我认为应该可以解决它。要么这样,要么在标题后放一个空注释)。 -
感谢您的反馈。一旦我的代码开始工作,我会考虑进行这些更改。