matlab與線性代數實驗基礎
作者:xuan97916
一、行列式
1、行列式的輸入
方括號內逐行鍵入元素,同一行元素用逗號或者空格,兩行元素之間用分號隔開。
在命令的末尾使用分號會終止輸出!
A=[1,2,3;4,5,6;7,8,9]
2、行列式元素的表示
可以用一個下標表示(從上到下之字形)也可以用兩個下標表示(行列)如
A(1,2) =A(4)
3、行列式的基本運算
· (1)讀取整行:A(行數,:)
(2)讀取整列:A(:,列數)
(3)讀取行列式中的部分行列b=A([行數,行數```],[列數,列數```])
(4)去掉行列式中的某些行列
A([行數,行數,…],:) =[ ]
A(:,[列數,列數,…]) =[ ]
(5)計算行列式的值
det(A)
二、矩陣
1、矩陣的輸入
生成m階單位方陣:eye(m)
生成m*n階單位矩陣:eye(m,n)
生成m階全1方陣:ones(m)
生成m*n階全1矩陣:ones(m,n)
生成m階全0方陣:zero(m)
生成m*n階全0矩陣:zeros(m,n)
2、矩陣的輸入
加法:A+B
減法:A-B
數乘:k*A
矩陣乘法:A*B
矩陣轉置:A’或者Transpose[A]
矩陣的逆:inv(A)
矩陣的行列式 det(A)
矩陣的冪:A^m
3、矩陣的相關函數
(1)生成矩陣的行數與列數:size(A)
第一個數是矩陣的行數,第二個數是矩陣的列數。
(2)生成對角矩陣:diag(A)
生成對角矩陣主對角線上的元素
(3)生成上三角矩陣:triu(A)
(4)生成下三角矩陣:tril(A)
三、矩陣的應用
1、向量組的秩:rank(A)
2、判斷線性相關性
一般步驟(1)輸入向量組
(2)用A’將行向量轉置爲列向量
·· (3)用rref(A)命令求秩
例:判斷向量組a1=(1 2 0 1), a2=(1 3 0 -1), a3=(-1 -1 1 0)是否線性相關,並求秩。
>> A=[1 2 0 1;1 3 0-1;-1 -1 1 0]; %輸入矩陣
>>A=A’ % 將行向量轉置爲列向量再求秩
>>rank(A) %求秩
Ans = 3
(注意:當rank(A)等於向量組個數時,線性無關,否則線性相關)
3、求向量組的極大無關組
一般步驟:(1)輸入向量組,並將其進行轉置
(2)化爲分數形式
(3)將向量化爲行最簡型
(4)對線性相關性進行判斷
注:將矩陣化爲行最簡型的命令爲:rref(A)或者rrefmovie(A)
例1:求下列向量組的秩和一個極大線性無關組,並將其餘向量用該極大無關組線性表示。
a1=(2 -1 3 5),a2=(4 -3 1 3),a3=(3 -2 3 4),
a4=(4 -1 15 17),a5=(7 -6 -7 0)
>> A=[2 -1 3 5;4 -3 1 3;3 -2 3 4;4 -1 15 17;7 -6 -7 0];
>> A=A′ %將行向量轉化爲列向量進行運算
>> format rat %分數格式形式
>> rref(A) %將A變換爲行最簡型
ans =
1 0 0 2 1
0 1 0 -3 5
0 0 1 4 -5
0 0 0 0 0
因爲前三行的向量均不全爲0,且第1,2,3列的均爲1開頭,所以a1,a2,a3爲一個極大無關組。
例2:求下列向量組的秩和一個極大線性無關組,並將其餘向量用該極大無關組線性表示。
a1=(1,-2,2,3),a2=(-2,4,-1,3),a3=(-1,2,0,3),a4=(0,6,2,3),a5=(2,-6,3,4)
解:
A=[1,-2,2,3;-2,4,-1,3;-1,2,0,3;0,6,2,3;2,-6,3,4]
>> A=A′ %將行向量轉化爲列向量進行運算
>> format rat %分數格式形式
>> rref(A) %將A變換爲行最簡型
A1,a2,a4爲一個線性無關組,a3,a5可用其其線性表示
3、線性方程組的求解
(1)使用克萊姆法則求解
>> A=[2 1-5 1;1 -3 0 -6;0 2 -1 2;1 4 -7 6]; %輸入係數矩陣
>>D=det(A) %判斷解的情況
D = 27
>> C1=A;C2=A;C3=A;C4=A;b=[8;9;-5;0];
%將A賦值給不同變量
>> C1(:,1)=b;D1=det(C1); %將某行替換爲係數列
x1=D1/D %x求解x1
x1 = 3
>> C2(:,2)=b;D2=det(C2);x2=D2/D
>> C3(:,3)=b;D3=det(C3);x3=D3/D
>> C4(:,4)=b;D4=det(C4);x4=D4/D
(2)使用矩陣左除法求線性方程的解
線性方程組AX=B的一個解爲X=A\B。
例:利用左除法求解上題中線性方程組的解.
>> A=[2 1 -5 1;1 -3 0 -6;0 2 -1 2;1 4 -7 6];
>>rank(A)
>> b=[8;9;-5;0];
>> x=A\b %左除法
x =
3.0000
-4.0000
-1.0000
1.0000
(3)利用矩陣的行(列)初等變換求線性方程組的通解
基本步驟:(1)將線性方程組表示成增廣矩陣的形式;
(2)對增廣矩陣實行初等變換,使增廣矩陣轉化爲行階梯形矩陣;
(3)得到方程組的解。
例:求解線性方程組
>>A=[1,1,1,1;0,1,-1,1;2,3,1,3]; %方程組的增廣矩陣
>>F=rref(A); %將方程組增廣矩陣化爲行階梯形矩陣
>>F %輸出增廣矩陣的行階梯形矩陣
F =
1 0 2 0
0 1 -1 1
0 0 0 0
由該階梯形矩陣,可得方程組:x1=-2x3 x2=x3+1
方程組解爲:
(4)求非齊次線性方程組的通解
非齊次線性方程組需要先判斷是否有解,若有解,再進一步求通解。
一般步驟爲:
第一步:判斷AX=b是否有解,若有解則進行第二步;(R(A)與R(A,b)比較,即比較係數矩陣的秩和增廣矩陣的秩)
第二步:求AX=b的一個特解;(矩陣除法)
第三步:求AX=0的通解;(利用null命令)
第四步:AX=b的通解:AX=0的通解+AX=b的一個特解。
例:判斷方程組
%第一步:判斷係數矩陣與增廣矩陣的秩
>> A=[1 -1 1 -1;-1 1 1 -1;2 -2 -1 1]; %係數矩陣A
>> b=[1;1;-1]; %常數b
>> rank(A) %係數矩陣的秩
ans =
2
>> rank([A,b]) %增廣矩陣的秩
ans =
2
%求通解
化行最簡形,用rref命令
>> rref([A,b])
ans =
1 -1 0 0 0
0 0 1 -1 1
0 0 0 0 0
取x2,x4爲自由變量,從而通解爲:x1=x2,x3=x4+1
(2)先求出特解及導出組的基礎解系, 用命令null,例如:
>>x0=A\b %方程組的一個特解
x0 =
0
0
1
0
>>x1=null(A) %求導出組的基礎解系
x1 =
-0.7071 0
-0.7071 0
-0.0000 0.7071
-0.0000 0.7071
故原方程組的通解爲
(x1,x2,x3,x4)=(0,0,1,0)+c1(-0.7071,-0.7071,0,0) +c2(0,0, 0.7071, 0.7071),c1,c2爲任意常數.
null是用來求齊次線性方程組的基礎解系的,加上'r'則求出的是一組最小正整數解,如果不加,則求出的是解空間的規範正交基。(x1=null(A,'r'))
四、運用矩陣運算進行圖像處理
1、圖像的讀寫
Imread:讀入各種圖像文件
[I,map]=imread(‘face.gif’)
Imwrite:輸出圖像,將圖像數據矩陣寫入文件中
Imwrite(i,‘face.gif’)
Imwrite(i,map,‘face.gif’)
2、圖像的顯示
Imshow:顯示各種圖像的函數
其中I是圖像數據矩陣,map是對應的顏色矩陣:
[I,map]=imread(‘face.gif’)
Imshow(I,map)
3、窗口的多開
[I,map]=imread(‘face.gif’)
Imshow(i.map)
[j,map]=imread(‘flowers.gif’)
Figure,imshow(j,map) %實現(j,map)窗口的多開
4、查看圖像的大小
[I,map]=imread(‘face1.gif’)
Size(i)
Ans=140 144 %表示高爲140 寬爲144
5、多幅圖像顯示在同一個對話框中
Subplot(n,m,p)將一個顯示對話框分成m行n列,並顯示第p幅圖像
Subplot(2,2,3),imshow(I3),title(‘I3圖像’)
表示將一個圖像顯示對話框分成2行2列,並在第3個位置顯示I3圖像,圖像標題爲“ I3圖像”
6、讀取圖像的基本操作
例1:讀取gif類型的圖像
>>[i.map]=imread(‘face.gif’)
>>Size(i)
>>size(map)
>>imshow(i.map)
>>A=[0 0 0;0 1 0;0 0 1] %設置顏色變換矩陣A
>>map=map*A %利用矩陣修改顏色表數據map
Imshow(I,map)
例2:讀取jpg類型的圖像文件
>>[I,map]=imread(‘face.jpg’)
>>size(i)
>>size(map)
>>imshow(I,map)
>>i((:,:,2)=i(:,:,2)*0 //將綠色矩陣的值設置爲0
>>imshow(I,map)
7、圖像相加、相減、數乘
(1)相加:降低圖像噪聲的影響
(2)相減:將兩圖的差異顯示出來
(3)數乘:數乘大於1的數,亮度增加;
數乘小於1的數,圖像變暗
五、在處理圖像水印中的應用
將水印嵌入到圖像中實質上是進行兩個圖像矩陣的加法運算
去掉水印則是進行矩陣減法運算。
(1)例:利用矩陣運算往圖像中嵌入文字水印的例子。
1.讀取原圖像hudie.jpg到I中。
>>I=imread('hudie.jpg');
>>imshow(I)
2.讀取原圖像hudie.jpg的大小,並將圖像的高、寬存到m、n中。
>>s=size(I);
>> m=s(1)
>> n=s(2)
3.讀取水印圖像huaduo_sy.jpg到J中,並將圖像大小調整成與原圖像相同。使用imresize()函數可以改變圖像的大小。
>>J=imread('xiaohui_sy.jpg');
>>imshow(J);
>>J1=imresize(J,[m,n]); //將圖像矩陣J的高、寬變爲m*n
4.將水印圖像的紅、綠、藍三個顏色矩陣乘上係數0.3,以降低像素點顏色的飽和度。
>>J1(:,:,1)= J1(:,:,1)*0.3;
>>J1(:,:,2)= J1(:,:,2)*0.3;
>>J1(:,:,3)= J1(:,:,3)*0.3;
5.將原圖像與改變後的水印圖像相加,嵌入水印。
>>I1=im2double(I);
>>J2=im2double(J1);
>> A=I1+J2;
>>imshow(A);
6.將嵌入水印後的圖像保存在hudie_add.jpg文件中。
>>imwrite(A,'hudie_add.jpg')
7.將處理過的數字圖像水印保存在xiaohui_syh.jpg文件中。
>>imwrite(J1, 'xiaohui_syh.jpg')
(2)去掉數字圖像水印
例:利用矩陣運算去掉圖像中的數字圖像水印的例子。
1.讀取嵌入水印的圖像hudie_add.jpg到SA中。
>>SA=imread('hudie_add.jpg');
>> imshow(SA)
2.讀取處理過的水印圖像xiaohui_syh.jpg到I中。
>> I=imread('xiaohui_syh.jpg');
3.將嵌入水印後的圖像與處理後的水印圖像相減,去掉水印。
>> SA1=im2double(SA);
>> I1=im2double(I);
>> A=SA1-I1;
>> imshow(A);
六、利用矩陣運算實現圖形的幾何變換
1.二維圖形變換
2、二維圖形組合變換
3、plot函數
(1)plot(Y)
如果Y 是向量,則以向量的索引爲橫座標,以向量元素值爲縱座標繪製圖形,以直線段順序連接各點;如果 Y 是矩陣,則繪製 Y 的各列;如果 Y是復向量,則以複數的實部爲橫座標,虛部爲縱座標繪製圖形
(2)plot(x,y)
命令中的 x 和y 可以爲向量和矩陣,當x和y的結構不同時,有不同的繪製方式。
–x、y 均爲 n 維向量時,以x 的元素爲橫座標,y 的元素爲縱座標繪製圖形。
–x 爲 n 維向量,y 爲m×n 或 n×m 矩陣時,以 x 的元素爲橫座標,繪製 y 的 m 個n 維向量。
–x、y 均爲 m×n 矩陣時,以x 的各列爲橫座標,y 的對應列爲縱座標繪製圖形。
(3)plot(x,y,LineSpec)
該命令中加入了 LineSpec參數,用於對圖形外觀的控制,包括線條的形狀、顏色和點的形狀、顏色。該參數的常用設置選項如表所示。
(4)圖形的比例變換
其中a代表橫座標放大的係數,d代表縱座標放大的係數
例1:由(1,2)、(4,5)、(3,6)三點組成的三角形,將其橫座標和縱座標同時放大2倍,求所得三角形的三點座標。
>>x=[1;4;3;1]; %將第一個座標在末尾重複寫一遍表示圖形閉合
>>y=[2;5;6;2];
>>A=[x y];
>>C=[2 0;0 2]; %C爲變換矩陣,使得其橫縱座標同時變爲2倍
>>B=A*C;
>>a=B(:,1);
>>b=B(:,2);
>> plot(x,y,':',a,b) %顯示兩個圖形的對比狀態
(5)圖形的對稱變換
A)對稱x軸
變換矩陣爲:
B)對稱Y軸
C)對稱座標原點
(6)圖形的旋轉變換
圖形在平面上繞座標原點逆時針旋轉 角,圖形發生旋轉變換。
變換爲:
例:由(1,2)、(4,5)、(3,6)三點組成三角形,求將其逆時針旋轉45弧度角後所得的圖形。
x=[1;4;3;1];
y=[2;5;6;2];
A=[xy];
C=[cos(45)sin(45);-sin(45) cos(45)];
B=A*C;
a=B(:,1);
b=B(:,2);
plot(x,y,':',a,b)
(7)平移變換
將圖形沿X方向移動距離m,沿Y方向移動距離n,圖形形狀保持不變,圖形各點的座標分別增加了平移量m和n。
平移變換的矩陣運算表示爲 :
例:由(1,2)、(4,5)、(3,6)三點組成三角形,求將其橫座標向右平移4,縱座標向上平移5後所得的圖形。
x=[1;4;3;1];
y=[2;5;6;2];
z=[1;1;1;1];
A=[x y z];
C=[1 00;0 1 0;4 5 1];
B=A*C;
a=B(:,1);
b=B(:,2);
plot(x,y, ':',a,b)
(8)綜合應用
例:由(0,0)、(2,0)、(1,2)三點組成三角形,將其各點座標沿軸向上平移4後,再繞座標原點逆時針旋轉45弧度後,求所得的圖形。
x=[0;2;1;0];
y=[0;0;2;0];
z=[1;1;1;1];
A=[x yz];
C=[1 0 0;0 1 0;0 4 1];
D=[cos(45)sin(45) 0;-sin(45) cos(45) 0;0 0 1]; %如果進行了平移變化後,再進行旋轉變換時,注意將旋轉變化的矩陣的階數提高,第一第二列補0,第三列爲0 0 1
E=C*D;
B=A*E;
a=B(:,1);
b=B(:,2);
plot(x,y, ':',a,b)
七、Hill加密算法
1、基本步驟
加密:
(1)將明文信息分組,每組s個數值,組成n組明文向量
(2)選定一個加密密鑰,其階數爲s,將這個密鑰分別左乘每個數值矩陣
(3)對矩陣進行模26運算,得到密文向量
例:
解密:
即將密文按同樣方式分組,用逆矩陣對其進行處理,對出現的負值加上26得到明文向量
>>x1=[19;20;21]; %密文1
>>x2=[4;25;13]; %密文2
>>x3=[1;20;8]; %密文3
>>A=[1 2 3;1 1 2;0 1 2] %加密密鑰
>>det(A) %求矩陣的行列式,判斷是否可逆
ans = -1
>>B=inv(A) %B是A的逆
>>X1=A*x1;
>>X2=A*x2;
>>X3=A*x3;
>>y1=mod(X1,26)
>>y2=mod(X2,26)
>>y3=mod(X3,26)
>>x1=B*y1
>>x2=B*y2
>>x3=B*y3
最後,生成明文信息。MATLAB代碼如下:
>> x1=mod(x1,26)
>>x2=mod(x2,26)
>>x3=mod(x3,26)
注意:要根據密碼錶的總數來確定模除法的數值
作者:xuan97916
參考資料: [1]王豔君,趙明華,李文斌,線性代數實驗教程[M],清華大學出版社,2011.12