【发布时间】:2020-07-12 08:27:00
【问题描述】:
我正在尝试实现上双对角矩阵 B 的分而治之 SVD,但我的代码不起作用。错误是:
"无法执行赋值,因为左边的大小是
3×3,右侧的大小为 2×2。
V_bar(1:k,1:k) = V1;"
有人可以帮我解决吗?谢谢。
function [U,S,V] = DivideConquer_SVD(B)
[m,n] = size(B);
k = floor(m/2);
if k == 0
U = 1;
V = 1;
S = B;
return;
else
% Divide the input matrix
alpha = B(k,k);
beta = B(k,k+1);
e1 = zeros(m,1);
e2 = zeros(m,1);
e1(k) = 1;
e2(k+1) = 1;
B1 = B(1:k-1,1:k);
B2 = B(k+1:m,k+1:m);
%recursive computations
[U1,S1,V1] = DivideConquer_SVD(B1);
[U2,S2,V2] = DivideConquer_SVD(B2);
U_bar = zeros(m);
U_bar(1:k-1,1:k-1) = U1;
U_bar(k,k) = 1;
U_bar((k+1):m,(k+1):m) = U2;
D = zeros(m);
D(1:k-1,1:k) = S1;
D((k+1):m,(k+1):m) = S2;
V_bar = zeros(m);
V_bar(1:k,1:k) = V1;
V_bar((k+1):m,(k+1):m) = V2;
u = alpha*e1'*V_bar + beta*e2'*V_bar;
u = u';
D_tilde = D*D + u*u';
% compute eigenvalues and eigenvectors of D^2+uu'
[L1,Q1] = eig(D_tilde);
eigs = diag(L1);
S = zeros(m,n)
S(1:(m+1):end) = eigs
U_tilde = Q1;
V_tilde = Q1;
%Compute eigenvectors of the original input matrix T
U = U_bar*U_tilde;
V = V_bar*V_tilde;
return;
end
【问题讨论】:
-
这个
B1 = B(1:k-1,1:k);应该是B1 = B(1:k,1:k);吗?此外,您的代码不正确,例如对于B = [-1](S矩阵应该只包含正值,您需要使U或V成为B的符号,并且S是1x1 矩阵的B的绝对值) -
你用的B尺寸是多少?我无法复制您的错误
-
@Yuval Harpaz,我使用了 6×6 矩阵
-
现在我得到了错误,@chtz 关于 B1 = B(1:k,1:k) 的评论呢?如果您从代码中删除所有 -1,则不会出现错误。如果你不这样做,你永远不会使用 B(k,k)
标签: matlab numeric numerical-methods numerical-computing