基於matlab的矩陣奇異值(SVD)分解

2021-09-29 01:58:07 字數 1997 閱讀 4183

目錄

1 計算原理

1.1求解v

1.2求解d

1.3求解u

2 matlab程式

2.1 注意

3 ****

設矩陣a的大小m*n(m>n),a = ud

首先求出的特徵值及特徵值的特徵值從大到小按順序排列,對應的正交特徵向量也要按特徵值的順序排列。排列好的正交的特徵向量即為v = [v1,v2],其中v1為非零特徵值的特徵列向量組成的矩陣,v2為零值的特徵列向量組成矩陣。v的大小為n*n。

d的形式為:

的奇異值,對角線的元素按從大到小排列。即

u1 =它是乙個m*r的形的次酉矩陣。u2的零特徵值對應的正交單位列向量組成的矩陣。u = [u1,u2],是乙個m*m的矩陣。

function [u,d,v]=mysvd(a)

[m,n] = size(a);

b=a;

if mn的情況 如果m0

n=n+1;

endend

si = size(v);

v1 = zeros(si(1),n);

% for i=1:n

% v1(:,i) = v(:,i); %非零特徵值向量

% end

v1(:,1:n) = v(:,1:n); %非零特徵值向量

si = size(d); %分離零和非零特徵向量

if n==si(1)%無零特徵值

v = v1;

else

v2 = v(:,n+1:si(1));

v = [v1,v2];

endh = zeros(n,n);%特徵值對角矩陣

for i=1:n

h(i,i) = d(si(1)-i+1,si(1)-i+1)^0.5; %奇異值矩陣

endh = inv(h);

u1 = a*v1*h;

[v1,d1] = eig(a*a');%d特徵值 v特徵向量

si = size(d1);

m = zeros(si(1),1);

for i=1:si(1)

m(i) = d1(i,i);

end m(m<1e-10)=0; %很關鍵的乙個限制,將小於某乙個數的特徵值設為0,否則無法判斷非零特徵值的數量

%求u2

% m = eig(a*a'); %求a*a'特徵值個數

si = size(m);

m = flip(m); %從大到小排列

n=0;%奇異值個數

for i=1:si(1)%計算零特徵向量

if m(i)==0

n = n+1;

endend

si = size(v1);

u2 = zeros(si(1),n);

u2 = v1(:,1:n);

u = [u1,u2];

d = zeros(size(a));

si = size(m);

for i=1:si(1)-n

d(i,i) = m(i)^0.5;

end[m,n] = size(b);

if m使用matlab計算矩陣奇異值分解時,會遇到計算過程中matlab 的輸出為零,但是檢視變數時卻不為零,是為乙個遠小於零的數。這個數極小,但是在變數中matlab卻不認為等於零,會影響判斷非零特徵值和零特徵值的個數,因此在程式中特定乙個限定值,將matlab的特徵值計算結果與限定值比較,小於限定值則認為特徵值為零。產生這種結果的原因應該是浮點運算的精度問題

奇異值 奇異矩陣 SVD分解 正交矩陣

奇異值 奇異值分解法是線性代數中一種重要的矩陣分解法,在訊號處理 統計學等領域有重要應用。定義 設a為m n階矩陣,a 表示a的轉置矩陣,a a的n個特徵值的非負平方根叫作a的奇異值。記為 i a 如果把a a的特徵值記為 i a a 則 i a sqrt i a a 奇異矩陣 奇異矩陣是線性代數的...

矩陣奇異值簡要介紹

奇異值分解是乙個非常,非常,非常大的話題,它的英文是 singular value decomposition,一般簡稱為 svd。下面先給出它大概的意思 對於任意乙個 m n 的矩陣 m 不妨假設 m n 它可以被分解為 m udv t 其中 先別急,我看到這個定義的時候和你一樣暈,感覺資訊量有點...

矩陣奇異值分解

奇異值分解是線性代數中一種重要的矩陣分解,在訊號處理 統計學等領域有重要應用。定義 設a為m n階矩陣,aha的n個特徵值的非負平方根叫作a的奇異值。記為 i a 如果把aha的特徵值記為 i a 則 i a i aha 1 2 定理 奇異值分解 設a為m n階復矩陣,則存在m階酉陣u和n階酉陣v,...