Я пытаюсь реализовать разделяй и властвуй SVD верхней двухдиагональной матрицы B, но мой код не работает. Ошибка:
"Невозможно выполнить присваивание, так как размер левой стороны 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
- абсолютным значениемB
для матриц 1x1) - person chtz   schedule 31.03.2020