Cet exemple avec norm
et des données aléatoires
A = randn(2000,2000);
tic;
n1 = norm(A)
toc;
donne
n1 = 89.298
Elapsed time is 2.16777 seconds.
Vous pouvez eigs
trouver un seul (le plus grand) des valeurs propres de la matrice symétrique A'*A
(ou A*A'
si elle est plus petit pour A
rectangulaire). Il utilise une méthode Lanczos iteration.
tic;
B = A'*A; % symmetric positive-definite. B = A*A' if it is smaller
n2 = sqrt(eigs(B, 1)),
toc
il sort:
n2 = 89.298
Elapsed time is 0.311942 seconds.
Si vous ne souhaitez pas utiliser norm
ou eigs
, et votre matrice A
possède de bonnes propriétés (valeurs singulières correctement séparées), vous pouvez essayer de se rapprocher avec une méthode power iteration:
tic;
B = A'*A; % or B = A*A' if it is smaller
x = B(:,1); % example of starting point, x will have the largest eigenvector
x = x/norm(x);
for i = 1:200
y = B*x;
y = y/norm(y);
% norm(x - y); % <- residual, you can try to use it to stop iteration
x = y;
end;
n3 = sqrt(mean(B*x./x)) % translate eigenvalue of B to singular value of A
toc
qui, pour la même matrice aléatoire (pas de propriétés particulièrement bonnes) donne une ~0.1%
solution précise:
n3 = 89.420
Elapsed time is 0.428032 seconds.
's (0,0)' est une syntaxe MATLAB non valide. Avez-vous même exécuté ce code? – Adriaan
Quel est le problème avec 'norm (A, 2)'? En général, si Matlab a une fonction intégrée, c'est le plus rapide que vous pouvez obtenir, en particulier pour l'algèbre matricielle –
que j'ai fait, mais pour les grandes matrices ce n'est pas bon – user3086871