目錄
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,...