【matlab】matlab與線性代數實驗基礎


    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變換爲行最簡型

wKiom1lOVL6DJrGnAAAMC_YPLDE413.png

A1,a2,a4爲一個線性無關組,a3,a5可用其其線性表示

3、線性方程組的求解

         (1)使用克萊姆法則求解

wKioL1lOVL6CJwRoAAAO67XEb_0475.png

>> 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)得到方程組的解。

例:求解線性方程組

wKiom1lOVL-RgtazAAAIylHYUvY443.png


>>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的大小,並將圖像的高、寬存到mn中。

>>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.二維圖形變換

         

wKioL1lOVL_S6LwBAAAEymALRUU356.png

2、二維圖形組合變換

         wKiom1lOVMDQlxFHAAAKcWvoOd8439.png

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)圖形的比例變換

     wKiom1lOVkCCysnCAAAD7Deb8J8768.png

其中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軸

         變換矩陣爲:

                            wKiom1lOVqHAnWvsAAACV5EYXFM165.png

       

B)對稱Y軸

變換矩陣爲:wKioL1lOVq_hZhJUAAACERABDh0153.png

C)對稱座標原點

     變換矩陣爲:wKiom1lOVsGxOvpUAAACK1BjelE142.png

(6)圖形的旋轉變換

圖形在平面上繞座標原點逆時針旋轉   角,圖形發生旋轉變換。

變換矩陣爲:wKiom1lOVs-jRyBWAAADWQ5JMhk067.png-wh_50  注意:變換角度單位爲弧度角!

變換爲:

wKioL1lOVt7RPgeyAAAHF-dozEQ404.png

例:由(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。

平移變換的矩陣運算表示爲 :

wKiom1lOVuui6GICAAAFc1LjNZs612.png

例:由(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






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章