【MATLAB】(八)矩陣

一.矩陣的定義

MATLAB 以矩陣作為數據操作的基本單位,這使得矩陣運算變得非常簡捷、方便、高效。矩陣是由m*n個數q(i=1,2,…,m;j=1,2,…,n),排成的m行n列數表,記成

稱為 mxn 矩陣,也可以記成aij或Am*n。其中,i表示行數,j表示列數。若 m=n,則該矩陣為n階矩陣(n階方陣)。

由有限個向量所組成的向量組可以構成矩陣,如果A=(aij)是mxn矩陣,那么A有m個n維行向量;有n個m維列向量。

矩陣的生成主要有直接輸入法、M 文件生成法和文本文件生成法等。?

二.MATLAB中矩陣的創建

1.按行直接輸入? ??

在鍵盤上直接按行方式輸入矩陣是最方便、最常用的創建數值矩陣的方法,尤其適合較小的簡單矩陣。在用此方法創建矩陣時,應當注意以下幾點。
①輸入矩陣時要以“[ ]”為其標識符號,矩陣的所有元素必須都在括號內。
②矩陣同行元素之間由空格(個數不限)或逗號分隔,行與行之間用分號或回車鍵分隔。
③矩陣大小不需要預先定義。
④矩陣元素可以是運算表達式。
⑤若“[ ]”中無元素,表示空矩陣。
⑥如果不想顯示中間結果,可以用“ ;”結束。

>> a=[15 15 15;15 15 15;15 15 15]a =15    15    1515    15    1515    15    15>> [[1 2 3];[2 4 6];[7 8 9]]ans =1     2     32     4     67     8     9>> [[1,1+i,2];[2,3+2i,1]]ans =1.0000 + 0.0000i   1.0000 + 1.0000i   2.0000 + 0.0000i2.0000 + 0.0000i   3.0000 + 2.0000i   1.0000 + 0.0000i

2.M文件生成法

? 當矩陣的規模比較大時,直接輸入法就顯得笨拙,出差錯也不易修改。為了解決這些問題,可以將所要輸入的矩陣按格式先寫入一文本文件中,并將此文件以m為其擴展名,即M 文件。

? M 文件是一種可以在 MATLAB 環境下運行的文本文件,它可以分為命令式文件函數式文件兩種。在此處主要用到的是命令式M 文件,用它的簡單形式來創建大型矩陣。在 MATLAB命令行窗口中輸入 M 文件名,所要輸入的大型矩陣即可被輸入到內存中。

M 文件中的變量名與文件名不能相同,否則會造成變量名和函數名的混亂。運行 M文件時,需要先將 M文件sample.m 復制到當前目錄文件夾下,否則運行時無法調用。

3.利用文本創建

?MATLAB 中的矩陣還可以由文本文件創建,即在文件夾(通常為work文件夾)中建立txt 文件,在命令行窗口中直接調用此文件名即可。

(1)事先在記事本中建立文件。
(2)以goods.txt保存,在MATLAB 命令行窗口中輸入。


由此創建商品矩陣x。

4.導入數據

?

三.MATLAB矩陣常用函數

(1)eye 函數:生成單位矩陣

>> E1=eye(3)E1 =1     0     00     1     00     0     1>> E2=eye(2,4)E2 =1     0     0     00     1     0     0>> E3=eye(size(E1))E3 =1     0     00     1     00     0     1

(2)?ones?函數:生成全 1 矩陣

% 生成 3×3 全 1 矩陣
O1 = ones(3);
disp('ones(3) 生成的全 1 矩陣:');
disp(O1);% 生成 2×4 全 1 矩陣 
O2 = ones(2, 4);
disp('ones(2, 4) 生成的全 1 矩陣:');
disp(O2);% 生成與矩陣 A 維數相同的全 1 矩陣
A = [1 2; 3 4; 5 6];
O3 = ones(size(A));
disp('ones(size(A)) 生成的全 1 矩陣(與 A 同維度):');
disp(O3);
>> test
ones(3) 生成的全 1 矩陣:1     1     11     1     11     1     1ones(2, 4) 生成的全 1 矩陣:1     1     1     11     1     1     1ones(size(A)) 生成的全 1 矩陣(與 A 同維度):1     11     11     1

?(3)eros 函數:生成全 0 矩陣

% 生成 3×2 全 0 矩陣 
Z1 = zeros(3, 2);
disp('zeros(3, 2) 生成的全 0 矩陣:');
disp(Z1);% 生成與矩陣 A 維數相同的全 0 矩陣
A = [1 2 3; 4 5 6];
Z2 = zeros(size(A));
disp('zeros(size(A)) 生成的全 0 矩陣(與 A 同維度):');
disp(Z2);
>> test
zeros(3, 2) 生成的全 0 矩陣:0     00     00     0zeros(size(A)) 生成的全 0 矩陣(與 A 同維度):0     0     00     0     0

(4)rand?函數:生成均勻分布隨機矩陣

每次運行結果不同,元素值在 0 到 1 之間隨機 。

% 生成 3×3 在 [0,1] 區間均勻分布的隨機矩陣
R1 = rand(3);
disp('rand(3) 生成的隨機矩陣:');
disp(R1);% 生成 2×4 在 [0,1] 區間均勻分布的隨機矩陣 
R2 = rand(2, 4);
disp('rand(2, 4) 生成的隨機矩陣:');
disp(R2);% 生成與矩陣 A 維數相同的隨機矩陣
A = [1 2; 3 4];
R3 = rand(size(A));
disp('rand(size(A)) 生成的隨機矩陣(與 A 同維度):');
disp(R3);
>> test
rand(3) 生成的隨機矩陣:0.8147    0.9134    0.27850.9058    0.6324    0.54690.1270    0.0975    0.9575rand(2, 4) 生成的隨機矩陣:0.9649    0.9706    0.4854    0.14190.1576    0.9572    0.8003    0.4218rand(size(A)) 生成的隨機矩陣(與 A 同維度):0.9157    0.95950.7922    0.6557

?(5)compan?函數:生成多項式伴隨矩陣

% 多項式系數向量 P,對應多項式 x^3 + 2x^2 + 3x + 4 (注意系數按降冪排列,缺項補 0 )
P = [1 2 3 4];
C = compan(P);
disp('compan(P) 生成的伴隨矩陣:');
disp(C);
>> test
compan(P) 生成的伴隨矩陣:-2    -3    -41     0     00     1     0

?生成的伴隨矩陣和多項式根等特性相關,可用于多項式分析

(6)diag 函數:生成對角矩陣

主對角線上是向量?v?的元素,其余為 0 。

% 以向量 v 的元素為對角線元素生成對角矩陣
v = [1 2 3];
D = diag(v);
disp('diag(v) 生成的對角矩陣:');
disp(D);
>> test
diag(v) 生成的對角矩陣:1     0     00     2     00     0     3

?(7)?hilb?函數:生成 Hilbert 矩陣

% 生成 3×3 Hilbert 矩陣
H = hilb(3);
disp('hilb(3) 生成的 Hilbert 矩陣:');
disp(H);
>> test
hilb(3) 生成的 Hilbert 矩陣:1.0000    0.5000    0.33330.5000    0.3333    0.25000.3333    0.2500    0.2000

Hilbert 矩陣元素?H(i,j) = 1/(i + j - 1)?,是典型的病態矩陣,常用于測試算法穩定性 。?

(8)magic?函數:生成魔方矩陣

% 生成 3 階魔方矩陣(每行、每列、兩條對角線元素和相等 )
M = magic(3);
disp('magic(3) 生成的魔方矩陣:');
disp(M);
>> test
magic(3) 生成的魔方矩陣:8     1     63     5     74     9     2

magic(n)?函數生成的?n?階魔方矩陣,是一個?n×n?的方陣,滿足每行、每列以及兩條主對角線上的元素之和都相等 ,這個相等的和值被稱為幻和?。數學上,n?階魔方矩陣幻和的計算公式是?S = n×(n2 + 1)/2?。3 階魔方矩陣經典結果是?[8 1 6; 3 5 7; 4 9 2]?,各行、列、對角線和為 15 。

(9)sparse 函數:生成稀疏矩陣

% 先創建一個普通矩陣 A
A = [0 0 1; 0 2 0; 3 0 0];
% 將 A 轉化為稀疏矩陣形式
S = sparse(A);
disp('sparse(A) 生成的稀疏矩陣:');
disp(S);
% 查看稀疏矩陣存儲方式(只存儲非零元素的下標和值 )
disp('稀疏矩陣的存儲內容:');
disp(full(S));  % full 函數可還原回普通矩陣查看 
>> test
sparse(A) 生成的稀疏矩陣:(3,1)        3(2,2)        2(1,3)        1稀疏矩陣的存儲內容:0     0     10     2     03     0     0

?稀疏矩陣適合存儲大部分元素為 0 的矩陣,節省內存,常用于大規模矩陣運算場景 。

四.MATLAB的矩陣運算

矩陣中的元素與向量中的元素一樣,可以進行抽取引用、編輯修改等操作。

1.矩陣元素的修改

矩陣建立起來之后,還需要對其元素進行修改。表5-1列出了常用的矩陣元素修改命令。

(1)矩陣的擴充

>> A=eye(2)A =1     00     1>> B=ones(2)B =1     11     1>> C=[A B]C =1     0     1     10     1     1     1>> D=[C;B A]D =1     0     1     10     1     1     11     1     1     01     1     0     1>> 

?需要注意的是C的列數需要和B+A的一樣

(2)矩陣中行的刪除

>> CC =1     0     1     10     1     1     1>> C(1,:)=[]C =0     1     1     1

(3)矩陣中列的刪除

>> C=[A B]C =1     0     1     10     1     1     1>> C(:,2)=[]C =1     1     10     1     1

?(4)矩陣中元素的賦值

>> D=[A;B C]D =1     2     34     5     61     0     00     1     0>> D(1,3)=5D =1     2     54     5     61     0     00     1     0

2.矩陣的變維

? 矩陣的變維可以用符號“ :”法和reshape 函數法。

①reshape 函數的調用

reshape(X,m,n),可將已知矩陣變維成m行n列的矩陣。

>> D(1,3)=5D =1     2     54     5     61     0     00     1     0>> reshape(D,3,4)ans =1     0     0     64     2     1     01     5     5     0

②“ :” 法

>> A=1:12A =列 1 至 111     2     3     4     5     6     7     8     9    10    11列 1212>> C=zeros(3,4)C =0     0     0     00     0     0     00     0     0     0>> C(:)=A(:)C =1     4     7    102     5     8    113     6     9    12

變維是按列重新排的

3.矩陣的變向

C =1     4     7    102     5     8    113     6     9    12>> flipdim(C,1)ans =3     6     9    122     5     8    111     4     7    10>> flipdim(C,2)ans =10     7     4     111     8     5     212     9     6     3

4.矩陣的抽取

?對矩陣元素的抽取主要是指對角元素和上(下)三角陣的抽取。對角矩陣和三角矩陣的抽取命令見表 5-3。

(1)diag(X,k)?和?diag(X):抽取矩陣對角線元素

% 創建一個 4×4 矩陣
X = [1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16];% 抽取主對角線(k=0)元素,得到向量 [1,6,11,16]
d0 = diag(X);
disp('diag(X) 抽取主對角線結果:');
disp(d0);% 抽取上方第 1 條對角線(k=1)元素,得到向量 [2,7,12]
d1 = diag(X,1);
disp('diag(X,1) 抽取上方第 1 條對角線結果:');
disp(d1);% 抽取下方第 1 條對角線(k=-1)元素,得到向量 [5,10,15]
d_1 = diag(X,-1);
disp('diag(X,-1) 抽取下方第 1 條對角線結果:');
disp(d_1);
>> test
diag(X) 抽取主對角線結果:161116diag(X,1) 抽取上方第 1 條對角線結果:2712diag(X,-1) 抽取下方第 1 條對角線結果:51015

k=0?對應主對角線,k>0?對應主對角線上方的對角線,k<0?對應主對角線下方的對角線,按此規則抽取對應位置元素組成向量 。?

(2)diag(v,k)?和?diag(v):用向量構造對角矩陣

% 定義向量 v
v = [10,20,30];% 構造主對角線為 v 的對角矩陣,得到 3×3 矩陣 diag(10,20,30)
M1 = diag(v);
disp('diag(v) 構造主對角線矩陣結果:');
disp(M1);% 構造上方第 1 條對角線為 v 的矩陣,得到 5×5 矩陣(行數 = 向量長度 + |k| ,這里 k=1 ,所以 3 + 1 = 4 ?實際是 length(v)+abs(k) ,v 長度 3 ,k=1 ,得到 4×4 矩陣 )
M2 = diag(v,1);
disp('diag(v,1) 構造上方第 1 條對角線矩陣結果:');
disp(M2);
>> test
diag(v) 構造主對角線矩陣結果:10     0     00    20     00     0    30diag(v,1) 構造上方第 1 條對角線矩陣結果:0    10     0     00     0    20     00     0     0    300     0     0     0

?diag(v)?會生成以?v?元素為主對角線的對角矩陣;diag(v,k)?則把?v?元素放到第?k?條對角線上,其余位置補 0 ,矩陣維度由向量長度和?k?共同決定 。

(3)tril?函數:提取下三角部分

% 還是用前面的 4×4 矩陣 X
X = [1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16];% 提取主下三角部分(主對角線及以下),得到下三角矩陣
T1 = tril(X);
disp('tril(X) 提取主下三角結果:');
disp(T1);% 提取第 1 條對角線下面的部分(包括第 1 條對角線,k=1 ,即主對角線及下方 1 條對角線 )
T2 = tril(X,1);
disp('tril(X,1) 提取第 1 條對角線下面部分結果:');
disp(T2);% 提取第 -1 條對角線下面的部分(k=-1 ,即主對角線下方第 1 條對角線及更下面 )
T3 = tril(X,-1);
disp('tril(X,-1) 提取第 -1 條對角線下面部分結果:');
disp(T3);
>> test
tril(X) 提取主下三角結果:1     0     0     05     6     0     09    10    11     013    14    15    16tril(X,1) 提取第 1 條對角線下面部分結果:1     2     0     05     6     7     09    10    11    1213    14    15    16tril(X,-1) 提取第 -1 條對角線下面部分結果:0     0     0     05     0     0     09    10     0     013    14    15     0

tril(X)?直接提取主對角線及以下元素,形成下三角矩陣;tril(X,k)?依據?k?值確定提取范圍,k?越大,包含的對角線越靠上,提取的下三角部分越 “大” 。

(4)triu 函數:提取上三角部分

% 基于矩陣 X 演示
X = [1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16];% 提取主上三角部分(主對角線及以上),得到上三角矩陣
U1 = triu(X);
disp('triu(X) 提取主上三角結果:');
disp(U1);% 提取第 1 條對角線上面的部分(包括第 1 條對角線,k=1 ,即主對角線及上方 1 條對角線 )
U2 = triu(X,1);
disp('triu(X,1) 提取第 1 條對角線上面部分結果:');
disp(U2);% 提取第 -1 條對角線上面的部分(k=-1 ,即主對角線上方第 1 條對角線及更上面 ,其實就是主對角線及以上 ,因為 k=-1 表示主對角線下方,取上面部分就是主對角線及以上 ,結果和 triu(X) 類似 )
U3 = triu(X,-1);
disp('triu(X,-1) 提取第 -1 條對角線上面部分結果:');
disp(U3);
>> test
triu(X) 提取主上三角結果:1     2     3     40     6     7     80     0    11    120     0     0    16triu(X,1) 提取第 1 條對角線上面部分結果:0     2     3     40     0     7     80     0     0    120     0     0     0triu(X,-1) 提取第 -1 條對角線上面部分結果:1     2     3     45     6     7     80    10    11    120     0    15    16

triu(X)?提取主對角線及以上元素形成上三角矩陣;triu(X,k)?根據?k?確定提取范圍,k?越小,包含的對角線越靠下,提取的上三角部分越 “大” ,和?tril?函數功能相反但邏輯類似 。

5.MATLAB矩陣基本運算

? 矩陣的基本運算包括加、減、乘、數乘、點乘、乘方、左除、右除、求逆等。其中加、減、乘與大家所學的線性代數中的定義是一樣的,相應的運算符為+ - *

? 矩陣的除法運算是MATLAB所特有的,分為左除和右除,相應運算符為“\”和“/”。一般情況下,方程 A*X=B 的解是 X=A\B,而方程 X*A=B 的解是 X=B/A。
對于上述的四則運算,需要注意的是:矩陣的加、減、乘運算的維數要求與線性代數中的要求一致。

(1)矩陣的加減法

設A=(ai),B=(b)都是mxn矩陣,矩陣A與B的和記成A+B,規定為

①交換律A+B=B+A
②結合律(A+B)+C=A+(B+C)

(2)矩陣的乘法運算

若3個矩陣有相乘關系,設A=(ai)是一個m*s矩陣,B=(b)是一個s*n矩陣,規定A與B的積為一個 m*n 矩陣 C=(cij)。

即 C=A*B,需要滿足以下3種條件:
①矩陣4的列數與矩陣B的行數相同;

②矩陣C的行數等于矩陣A的行數,矩陣C的列數等于矩陣B的列數;

③矩陣C的第m行n列元素值等于矩陣A的m行元素與矩陣B的n列元素對應值積的和。

>> a=[1 2 3;4 5 6;7 8 9];
>> b=[4 5 6;7 8 9;10 11 12];
>> a*bans =48    54    60111   126   141174   198   222

注意:

①若矩陣A、B滿足AB=0,未必有A=0或 B=0 的結論。

②AB≠BA,矩陣的乘法并不滿足交換律。

(3)矩陣的點乘運算

點乘運算指將兩矩陣中相同位置的元素進行相乘運算,將積保存在原位置組成新矩陣。

>> a=[1 2 3;4 5 6;7 8 9]a =1     2     34     5     67     8     9>> b=[4 5 6;7 8 9;10 11 12]b =4     5     67     8     910    11    12>> a.*bans =4    10    1828    40    5470    88   108

(4)矩陣的除法運算

? 計算左除A\B時,A的行數要與B的行數一致。計算右除A/B時,A的列數要與B的列數一致。
①.左除運算
由于矩陣的特殊性,A*B通常不等于 B*A,除法也一樣。因此除法要區分左右。線性方程組 D*X=B,如果D非奇異,即它的逆矩陣 inv(D)存在,則其解用 MATLAB 表示為X=inv(D)*B=D\B。符號“\”稱為左除,即分母放在左邊。
左除的條件:B的行數等于D的階數(D的行數和列數相同,簡稱階數)。

? ②.右除運算
若方程組表示為 X*D1=B1,D1非奇異,即它的逆陣 inv(D1)存在,則其解為X=B1*inv(D1)=B1/D1
符號“/”稱為右除。
右除的條件:B1的列數等于D1的階數(D1的行數和列數相同,簡稱階數)。

5.MATLAB矩陣運算常用函數

(1) 基礎矩陣運算(行列式、逆、秩、跡)

% 定義一個測試矩陣
A = [1 2 3; 4 5 6; 7 8 9];% 1. det:計算行列式
det_A = det(A);
disp('det(A) 行列式結果:');
disp(det_A);  % 輸出 0(因為矩陣行線性相關)% 2. inv:計算矩陣的逆(注意:奇異矩陣無逆,這里換可逆矩陣演示)
B = [1 2; 3 4];
inv_B = inv(B);
disp('inv(B) 矩陣的逆:');
disp(inv_B);  % 輸出 [-2 1; 1.5 -0.5]% 3. rank:計算矩陣的秩
rank_A = rank(A);
disp('rank(A) 矩陣的秩:');
disp(rank_A);  % 輸出 2(因為行線性相關)% 4. trace:計算矩陣的跡(主對角線元素和)
trace_A = trace(A);
disp('trace(A) 矩陣的跡:');
disp(trace_A);  % 輸出 1+5+9=15
>> test
det(A) 行列式結果:6.6613e-16inv(B) 矩陣的逆:-2.0000    1.00001.5000   -0.5000rank(A) 矩陣的秩:2trace(A) 矩陣的跡:15

(2)特征值與范數

% 定義矩陣
C = [1 0; 0 2];% 5. eig:計算特征值
eig_C = eig(C);
disp('eig(C) 特征值:');
disp(eig_C);  % 輸出 [1; 2](對角矩陣的特征值就是對角線元素)% 6. norm:計算矩陣的范數(默認 2-范數)
norm_C = norm(C);
disp('norm(C) 矩陣范數(2-范數):');
disp(norm_C);  % 輸出 2(最大奇異值,對角矩陣的 2-范數是最大對角線元素)% 7. normest:估算 2-范數(適合大矩陣快速計算)
normest_C = normest(C);
disp('normest(C) 估算 2-范數:');
disp(normest_C);  % 輸出 2(與 norm 結果一致)
>> test
eig(C) 特征值:12norm(C) 矩陣范數(2-范數):2normest(C) 估算 2-范數:2.0000

(3)?矩陣變換(三角矩陣、翻轉、旋轉)

% 定義矩陣
D = [1 2 3; 4 5 6; 7 8 9];% 8. triu:提取上三角矩陣
triu_D = triu(D);
disp('triu(D) 上三角矩陣:');
disp(triu_D);  
% 輸出:
% 1 2 3
% 0 5 6
% 0 0 9% 9. tril:提取下三角矩陣
tril_D = tril(D);
disp('tril(D) 下三角矩陣:');
disp(tril_D);  
% 輸出:
% 1 0 0
% 4 5 0
% 7 8 9% 10. rot90:逆時針旋轉 90°
rot90_D = rot90(D);
disp('rot90(D) 逆時針旋轉 90°:');
disp(rot90_D);  
% 輸出:
% 3 6 9
% 2 5 8
% 1 4 7% 11. fliplr:左右翻轉
fliplr_D = fliplr(D);
disp('fliplr(D) 左右翻轉:');
disp(fliplr_D);  
% 輸出:
% 3 2 1
% 6 5 4
% 9 8 7% 12. flipud:上下翻轉
flipud_D = flipud(D);
disp('flipud(D) 上下翻轉:');
disp(flipud_D);  
% 輸出:
% 7 8 9
% 4 5 6
% 1 2 3
>> test
triu(D) 上三角矩陣:1     2     30     5     60     0     9tril(D) 下三角矩陣:1     0     04     5     07     8     9rot90(D) 逆時針旋轉 90°:3     6     92     5     81     4     7fliplr(D) 左右翻轉:3     2     16     5     49     8     7flipud(D) 上下翻轉:7     8     94     5     61     2     3

(4)高級運算(條件數、指數、對數)

% 定義一個可逆且特征值全為正的矩陣(避免logm警告)
E = [4 1; 1 3];  % 特征值為5和2(均為正數,確保logm返回實數)% 13. cond:計算條件數(衡量矩陣病態程度,值越大越病態)
cond_E = cond(E);
disp('cond(E) 條件數:');
disp(cond_E);  % 輸出約2.618(值較小,矩陣性態良好)% 14. expm:矩陣的指數運算(基于矩陣冪級數)
expm_E = expm(E);
disp('expm(E) 矩陣指數:');
disp(expm_E);  
% 輸出指數矩陣(實數結果)
% 原理:expm(E) = sum_{k=0}^∞ (E^k / k!)% 15. logm:矩陣的對數運算(expm的逆運算)
logm_E = logm(E);
disp('logm(E) 矩陣對數:');
disp(logm_E);  
% 輸出對數矩陣(實數結果,無警告)
% 驗證:expm(logm_E) 應近似等于原矩陣E
disp('驗證 logm 與 expm 的互逆性:');
disp(expm(logm_E));  % 輸出接近原矩陣E
>> test
cond(E) 條件數:1.9387expm(E) 矩陣指數:76.2898   40.458840.4588   35.8311logm(E) 矩陣對數:1.3470    0.29610.2961    1.0509驗證 logm 與 expm 的互逆性:4.0000    1.00001.0000    3.0000

?(5)?矩陣重構與簡化

% 定義矩陣
F = [1 2 3 4; 5 6 7 8];% 16. reshape:改變矩陣維度(元素按列優先重構)
reshape_F = reshape(F, 4, 2);
disp('reshape(F,4,2) 改變維度:');
disp(reshape_F);  
% 輸出:
% 1 5
% 2 6
% 3 7
% 4 8% 17. rref:轉換成行最簡階梯形
G = [1 2 3; 4 5 6; 7 8 9];
rref_G = rref(G);
disp('rref(G) 行最簡階梯形:');
disp(rref_G);  
% 輸出:
% 1 0 -1
% 0 1 2
% 0 0 0
>> test
reshape(F,4,2) 改變維度:1     35     72     46     8rref(G) 行最簡階梯形:1     0    -10     1     20     0     0

?(6)?特殊矩陣運算

% 1. 先創建一個有復數特征值的矩陣(例如旋轉矩陣)
A = [0 -1; 1 0];  % 特征值為 i 和 -i(共軛復數)% 2. 求復數特征值和特征向量
[Vc, Dc] = eig(A);  % Vc 是復數特征向量,Dc 是復數對角矩陣(特征值)% 3. 使用 cdf2rdf 轉換為實數塊對角形式
[V, D] = cdf2rdf(Vc, Dc);% 顯示結果
disp('復數特征向量矩陣 Vc:');
disp(Vc);
disp('復數對角矩陣 Dc(特征值):');
disp(Dc);
disp('轉換后的實數特征向量矩陣 V:');
disp(V);
disp('轉換后的實數塊對角矩陣 D:');
disp(D);
>> test
復數特征向量矩陣 Vc:0.7071 + 0.0000i   0.7071 + 0.0000i0.0000 - 0.7071i   0.0000 + 0.7071i復數對角矩陣 Dc(特征值):0.0000 + 1.0000i   0.0000 + 0.0000i0.0000 + 0.0000i   0.0000 - 1.0000i轉換后的實數特征向量矩陣 V:1.0000         00   -1.0000轉換后的實數塊對角矩陣 D:0     1-1     0

6.MATLAB矩陣的冪運算

A是一個n階矩陣,k是一個正整數,規定A^k=A*A*A*......*A(k個A相乘),稱為矩陣的冪。其中k,l為正整數。

矩陣的冪運算是將矩陣中每個元素進行乘方運算,即:

在MATLAB中,冪運算就是在乘方符號" .^ "后面輸入冪的次數。對于單個n階矩陣A,A^k*A^l=A^(k+l),(A^K)^l=A^(k*l)。

對于兩個n階矩陣A與B,(A*B)^k≠A^k*B^k

7.MATLAB逆矩陣

(1)逆矩陣的定義

對于n階方陣 A,如果有n階方陣B滿足AB=BA=I,則稱矩陣A為可逆的,稱方陣B為A的逆矩陣,記為 A^(-1)。

(2)逆矩陣的性質:

①若 A可逆,則A^(-1)是唯一的。

②若A可逆,則A^(-1)也可逆,并且(A^(-1))^(-1)=A。

③若n階方陣A與B都可逆,則AB也可逆,且(AB)-1=B-A-。

④若 A可逆,則|A^(-1)|=|A|^(-1)

(3)奇異矩陣和非奇異矩陣:

我們把滿足|A|≠0 的方陣 A稱為非奇異的,否則就稱為奇異的

(4)求解矩陣的逆使用函數 inv

調用格式:Y=inv(x)

(5)求解矩陣的逆條件數值使用函數 rcond

另外,常用的運算還有指數函數、對數函數、平方根函數等。用戶可查看相應的幫助獲得使用方法和相關信息。

8.MATLAB中矩陣的條件數

(1)矩陣的條件數

在數值分析中是一個重要的概念,在工程計算中也是必不可少的,它用于刻畫一個矩陣的“病態”程度。

(2)條件數的定義

對于非奇異矩陣 A,其條件數的定義為cond(A)v=||A^-1||v *||A||v,其中v=1,2,……,F
它是一個大于或等于1的實數,當A的條件數相對較大,即cond(A)>>1時,矩陣A是“病態”的,反之是“良態”的。

9.MATLAB中矩陣的范式

范數是數值分析中的一個概念,它是向量或矩陣大小的一種度量,在工程計算中有著重要的作用。對于向量x∈R^n,常用的向量范數有以下幾種。

10.MATLAB中的奇異值分解

11.MATLAB中矩陣運算的方程求解

? 無論是在工程應用問題還是數學計算問題,方程都是問題轉化的重要途徑之一,通過將復雜的問題簡單轉化成矩陣的求解問題,最后在MATLAB 中進行函數計算。本節通過對一個方程組的應用來介紹如何介紹方程組的求解問題。

利用 MATLAB 中求解多元方程組的不同方法進行求解。

上面的方程符合Ax=b,首先需要確定方程組解的信息

系數矩陣?A?是由方程組中未知數 x1,x2,x3,x4?的系數按行排列構成的矩陣:

常數項向量?b?是方程組等號右邊的常數按行排列構成的列向量:

方法一:利用矩陣求逆(inv?函數 )

思路:如果矩陣?A?是可逆的(即行列式?det(A)≠0?,滿秩 ),那么方程組的解x=A^-1*b

% 定義系數矩陣 A
A = [2 1 -5 1; 1 -3 0 -6; 0 2 -1 2; 1 4 -7 6];
% 定義常數項向量 b
b = [8; 9; -5; 0];% 計算矩陣 A 的逆矩陣
A_inv = inv(A);
% 求解方程組 Ax = b,得到解向量 x
x = A_inv * b;% 顯示解
disp('方程組的解為:');
disp(x);
>> test
方程組的解為:3.0000-4.0000-1.00001.0000

首先通過?inv?函數求矩陣?A?的逆矩陣A_inv,然后將其與常數項向量?b?相乘,得到解向量?x?。

方法二:左除運算(\?運算符 )

在 MATLAB 中,對于線性方程組?Ax = b?,更高效且數值穩定性更好的方法是使用左除運算符?\?,代碼如下:

% 定義系數矩陣 A
A = [2 1 -5 1; 1 -3 0 -6; 0 2 -1 2; 1 4 -7 6];
% 定義常數項向量 b
b = [8; 9; -5; 0];% 直接使用左除運算求解
x = A \ b;% 顯示解
disp('方程組的解為:');
disp(x);
>> test
方程組的解為:3.0000-4.0000-1.00001.0000

左除運算會根據矩陣?A?的特性(是否為方陣、是否滿秩等 )自動選擇合適的算法來求解方程組,一般優先推薦這種方法。?

方法三:通過求秩和增廣矩陣判斷解的情況

在求解前,也可以先判斷方程組解的情況,通過計算系數矩陣?A?的秩rank(A)和增廣矩陣?[A|b]的秩rank([A b] 來確定:

% 定義系數矩陣 A
A = [2 1 -5 1; 1 -3 0 -6; 0 2 -1 2; 1 4 -7 6];
% 定義常數項向量 b
b = [8; 9; -5; 0];% 構造增廣矩陣
aug_matrix = [A b];% 計算系數矩陣的秩和增廣矩陣的秩
rank_A = rank(A);
rank_aug = rank(aug_matrix);if rank_A == rank_aug && rank_A == size(A, 2)disp('方程組有唯一解,求解結果如下:');x = A \ b;disp(x);
elseif rank_A == rank_aug && rank_A < size(A, 2)disp('方程組有無窮多解');
elsedisp('方程組無解');
end
>> test
方程組有唯一解,求解結果如下:3.0000-4.0000-1.00001.0000

?
這里?size(A, 2)?是獲取矩陣?A?的列數(即未知數的個數 )。當系數矩陣的秩和增廣矩陣的秩相等且等于未知數個數時,方程組有唯一解;當秩相等但小于未知數個數時,有無窮多解;當秩不相等時,方程組無解 。在你的這個例子中,一般是有唯一解的情況,然后再用左除等方法求解。

-----------------------------

編自2025/8/4和8/5。依舊無言

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/92049.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/92049.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/92049.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python的高校考研交流系統

前端開發框架:vue.js 數據庫 mysql 版本不限 后端語言框架支持&#xff1a; 1 java(SSM/springboot)-idea/eclipse 2.NodejsVue.js -vscode 3.python(flask/django)–pycharm/vscode 4.php(thinkphp/laravel)-hbuilderx 數據庫工具&#xff1a;Navicat/SQLyog等都可以 在當今社…

從零開始部署Qwen3-8b大模型到本地

一、方法一&#xff08;使用docker鏡像進行部署&#xff09; 安裝Linux服務器&#xff0c;本機測試系統為Ubuntu系統&#xff1b;(帶有2張A100的GPU服務器) 思路為&#xff1a;使用docker部署python環境鏡像在此基礎上安裝vllm拉取Qwen3-8b模型 docker-compose.yml文件部分配…

AI產品經理如何理解和應用Transformer架構,以提升產品的技術能力和用戶體驗?

?你好&#xff0c;我是 ?三橋君? 助你邁向AGI時代&#xff01;&#xff01;&#xff01; &#x1f4cc;本文介紹&#x1f4cc; >> 一、引言 在當今的AI浪潮中&#xff0c;Transformer架構已不再是一個陌生的技術名詞。從OpenAI的GPT系列到Google的BERT&#xff0c;再…

數據結構(四)內核鏈表、棧與隊列

一、內核鏈表基礎1. 什么是 Linux 內核鏈表&#xff1f;Linux 內核鏈表是一種高效的 雙向循環鏈表&#xff0c;廣泛應用于內核模塊開發中&#xff0c;用于管理數據結構。每個節點通過指針連接前一個和后一個元素&#xff0c;實現插入和刪除的高性能。2. 鏈表的定義與初始化在 L…

軟考信息安全工程師11月備考

目前是在職備考&#xff0c;主業是移動端開發工程師。第一個月(8.4-9.6)&#xff0c;將分享完下面所有章節內容&#xff0c;平均不到兩天更新一節1.網絡信息安全概述2.網絡攻擊原理與常用方法3.密碼學基本理論4.網絡安全體系與網絡安全模型5.物理與環境安全技術6.認證技術與原理…

使用DrissionPage實現xhs筆記自動翻頁并爬取筆記視頻、圖片

使用DrissionPage實現xhs筆記自動翻頁并爬取筆記視頻、圖片 聲明: 本文章中所有內容僅供學習交流使用,不用于其他任何目的,不提供完整代碼,抓包內容、敏感網址、數據接口等均已做脫敏處理,嚴禁用于商業用途和非法用途,否則由此產生的一切后果均與作者無關! 本文章未經…

使用 input 上傳文件, 選擇文件后再次修改文件再上傳失敗( <input type=“file“ /> 自定義上傳)

業務實際需求&#xff1a;點擊【選擇】按鈕先選擇文件&#xff0c;展示文件的詳情&#xff1a;類型&#xff0c;大小&#xff0c;日期......點擊【上傳】按鈕這個時候才去上傳文件如圖&#xff1a;BUG復現&#xff1a;點擊上傳文件后發現xlsx文件有些數據沒填寫&#xff0c;然后…

Win11 下解決 VScode/Trae 插件加載慢, 整個 VScode/Trae 很卡

最近在使用 Trae 寫代碼, 突然變得很卡, 尤其是插件系統, 比如我打開插件的面板, 以及比如我想預覽一下寫好的 .md 文件 (已安裝了 Markdown Preview Enhanced 插件), 這些都要好幾分鐘才能打開. 最初以為是 Trae 壞掉了, 然后重啟 Trae 不管用, 再重啟電腦居然也不管用, 接著…

微型導軌:智能家居抽屜的智能化應用

當智能家居從“功能堆砌”轉向“體驗升級”&#xff0c;微型導軌憑借超薄結構、靜音運行與精準定位能力&#xff0c;成為隱藏式設計、自動化交互的核心部件&#xff0c;讓家具“動”得優雅且可靠。智能掃地機器人&#xff1a;微型導軌被應用于邊刷的伸縮調節機構&#xff0c;能…

百套易語言教程、易語言視頻教程【易語言編程入門教程】

百套易語言教程、易語言視頻教程【易語言編程入門教程】 易語言輔助教程&#xff08;愛易編程論壇講師 24課講師&#xff1a;遠航 9課愛易編程論壇講師&#xff1a;愛易、小Call 8課&#xff09;.rar 時光論壇易語言全套教程【易語言零基礎易語言抓包易語言填表】完整版.rar 易…

nlp-詞匯分析

目錄 一、語言中的詞匯 1、詞的形態學 2、詞的詞性 二、詞語規范化 1、詞語切分 2、詞形還原 3、詞干提取 三、中文分詞 1、概述 2、基于最大匹配的中文分詞 3、基于線性鏈條件隨機場的中文分詞 4、基于感知器的中文分詞 詞序列預測 模型參數學習 特征定義 5、…

Kafka ISR機制和Raft區別:副本數優化的秘密

Kafka的ISR機制和像Raft這樣的傳統基于Quorum&#xff08;法定人數&#xff09;的協議之間的區別確實很微妙&#xff0c;但也非常重要。讓我們來分析一下為什么ISR可以減少所需的副本數量。在采用ISR模型和&#xff08;f1&#xff09;個副本數的配置下&#xff0c;一個Kafka分區…

新手向:GitCode疑難問題診療

Git疑難問題診療引言在軟件開發過程中&#xff0c;版本控制系統&#xff08;VCS&#xff09;是不可或缺的工具&#xff0c;而Git以其分布式架構、強大的分支管理能力和高效的性能成為行業標準。然而&#xff0c;隨著項目復雜度的提升&#xff0c;Git的使用也可能遇到各種疑難問…

電子電氣架構 ---如何煥新升級為 48V 電氣架構

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

JavaScript判斷數字方法

在JavaScript中&#xff0c;判斷一個值是否為數字有多種場景&#xff0c;以下是常見方法及適用情況&#xff1a;1. 嚴格判斷數字類型&#xff08;排除NaN&#xff09;使用 typeof 結合 !isNaN()&#xff0c;確保值是 number 類型且非 NaN&#xff1a;javascriptfunction isNumb…

C++編程之旅-- -- --始探門庭的求知漫溯(二)

目錄引用內聯函數(C11)auto關鍵字基于范圍的for循環指針空值---nullptr引用 引用&#xff1a;指將變量以另一個名稱來展現的。它并非是一個新變量而是一個別名&#xff0c;它們同指一塊內存空間。就如古時那些有字的人,亦或者是周樹人&#xff0c;你說魯迅是不是周樹人呢&…

wordpress網站的“管理員郵箱地址”有什么用?

在WordPress網站的“設置”-“常規”中設置的“管理員郵箱地址”有多種用途&#xff0c;以下是詳細介紹&#xff1a; 一、用戶注冊相關 密碼找回功能 當網站用戶忘記密碼時&#xff0c;他們會通過點擊登錄頁面上的“忘記密碼”鏈接來重置密碼。WordPress系統會向管理員郵箱地…

202506 電子學會青少年等級考試機器人六級實際操作真題

更多內容和歷年真題請查看網站&#xff1a;【試卷中心 -----> 電子學會 ----> 機器人技術 ----> 六級】 網站鏈接 青少年軟件編程歷年真題模擬題實時更新 202506 青少年等級考試機器人實操真題六級 一、實際操作 1. 主題&#xff1a;姿態傳感器交互步進電機左右…

Centos 安裝 redis

1.下載redis&#xff0c;這個自己去網上找吧。2.上傳文件&#xff0c;redis-7.4.1.tar.gz3.解壓&#xff1a;執行 tar -xf redis-7.4.1.tar.gz在進行安裝之前&#xff0c;檢查一下有沒有make、gcc、python3、沒有的話全部 yum install。安裝完之后&#xff0c;如果報一下錯誤&a…

算法訓練營DAY55 第十一章:圖論part05

并查集理論基礎 背景 當我們需要判斷兩個元素是否在同一個集合里的時候&#xff0c;我們就要想到用并查集。 并查集主要有兩個功能&#xff1a; 將兩個元素添加到一個集合中。判斷兩個元素在不在同一個集合 原理講解 從代碼層面&#xff0c;我們如何將兩個元素添加到同一個…