① MATLAB編程與應用系列-第3章 矩陣運算(4)
矩陣的分解是矩陣相關運算中的重要內容,MATLAB提供了用於矩陣分解運算的多種函數。本節將集中介紹MATLAB所提供的矩陣分解運算函數的功能及使用。
矩陣的三角分解又稱高斯消去法分解,它的目的是將一個矩陣分解成一個下三角矩陣L和一個上三角矩陣U的乘積,即A=LU。MATLAB提供了專門的函數lu來計算矩陣的LU分解。該函數的調用格式如下:
其中,返回矩陣U為上三角陣,矩陣L為下三角陣或其變換形式,且滿足LU=X。返回矩陣P為單位矩陣的行變換矩陣,滿足LU=PX。
奇異值分解在矩陣分析中佔有極其重要的作用。MATLAB提供了用於矩陣奇異值分解的函數svd,該函數是利用LINPACK程序庫中的ZSVDC編制而成的。在計算的過程中假如經過75步QR分解仍得不到一個奇異值,那麼系統會給出「不收斂」的提示。奇異值分解函數svd的幾種調用格式如下:
其中,命令①返迴向量s包含矩陣X分解所得到的全部奇異值向量。命令② 返回一個與X同大小的對角矩陣S和兩個酉矩陣U與V,且滿足= U S V'。命令③ 得到一個「有效大小」的分解,如果m×n維矩陣X中m>n則只計算出矩陣U的前n列,矩陣S的大小為n×n。
MATLAB提供了eig函數來對矩陣進行特徵值分解,該函數的幾種調用格式如下:
其中,①計算矩陣A的特徵值d,返回結果以向量形式存放。②計算方陣A和B的廣義特徵值d,返回結果以向量形式存放。③計算矩陣A的特徵值對角陣D和特徵向量陣V,使AV=VD成立。④計算矩陣A的特徵值對角陣D和特徵向量陣V,使AV=VD成立。當矩陣A中有與截斷誤差數量級相差不遠的值時,該指令可能更精確。'nobalance'起誤差調節作用。⑤計算矩陣A和B的廣義特徵值向量陣V和廣義特徵值陣D,滿足AV=BVD。最後一條命令⑥由flag指定演算法計算矩陣A和B的特徵值D和特徵向量V。其中,flag的可能值為:'chol' 和'qz' 。當flag值為'chol'時表示對B使用Cholesky分解演算法,其中A為對稱Hermitian矩陣,B為正定陣。當flag值為'qz'時表示使用QZ演算法,其中A、B為非對稱或非Hermitian矩陣。
MATLAB提供了chol函數來對矩陣進行Cholesky分解,該函數的調用格式為:
函數調用格式①如果X為n階對稱正定矩陣,則存在一個實的非奇異上三角陣R,滿足R'*R = X;若X非正定,則產生錯誤信息。②不產生任何錯誤信息,若X為正定陣,則p=0,R與上相同;若X非正定,則p為正整數,R是有序的上三角陣。
正交矩陣是指矩陣的列向量相互正交,且各個列向量的長度相等。QR分解就是將矩陣A分解成一個正交矩陣與一個上三角矩陣的乘積。MATLAB提供了用於矩陣QR分解的函數,表3.7中介紹用於矩陣QR分解的函數調用格式和功能。
表3.7 矩陣QR分解
Schur分解將使用schur函數,該函數的調用格式為:
命令行①-③返回正交矩陣U和schur矩陣T,滿足A = U T U'。其中,若A有復特徵根,則flag='complex',否則flag='real'。
即使是實陣,在其特徵值中也可能出現復數。實際使用中常需要把這一對對共軛復數特徵值轉化為一個(2x2)的實數塊。函數調用格式為:
MATLAB提供了gsvd函數對矩陣進行廣義奇異值分解,其具體調用格式為:
其中,函數調用格式①返回酉矩陣U和V、一個普通方陣X、非負對角矩陣C和S,滿足A = U C X',B = V S X',C' C + S' S = I (I為單位矩陣)。A和B的列數必須相同,行數可以不同。函數調用格式②和①基本相同,而③則返回廣義奇異值sigma值。
MATLAB提供了qz函數對矩陣進行特徵值問題的QZ分解,該函數的調用格式為:
其中函數調用格式①中A、B為方陣,返回結果AA和BB為上三角陣,Q、Z為正交矩陣或其列變換形式,V為特徵向量陣,且滿足Q A Z= AA 和Q B Z = BB。命令行②產生由flag決定的分解結果,flag取值為'complex'表示復數分解(默認);取值為'real'表示實數分解。
如果矩陣H的第一子對角線下元素都是0,則H為海森伯格(Hessenberg)矩陣。如果矩陣是對稱矩陣,則它的海森伯格形式是對角三角陣。MATLAB可以通過相似變換將矩陣變換成這種形式,具體調用格式為:
② 使用matlab編程:有一個4行5列的矩陣,編程求出其最大值以及最大值所處位置
舉個例子,希望有所幫助。代碼% 有一個4行5列的矩陣,編程求出其最大值以及最大值所處位置
clc; clear all;
A = rand(4, 5);
m = A(1); ind = [1 1];
for i = 1 : size(A, 1)
for j = 1 : size(A, 2)
if m < A(i, j)
m = A(i, j);
ind = [i j];
end
end
end
m
ind
A(ind(1), ind(2))
結果
③ 給出一個矩陣(二維數組),通過編程計算一下矩陣上三角元素的和,要求元素的值由鍵盤輸入。
代碼如下:
#include<stdio.h>
int main() {
int i, j;
int max, row, colum;
int a[3][4] = { { 1, 2, 3, 4 }, { 9, 8, 7, 6 }, { -10, 10, -5, 2 } };
max = a[0][0];
for (i = 0; i < 3; i++)
for (j = 0; j < 4; j++)
if (max < a[i][j]) {
max = a[i][j];
row = i;
colum = j;
}
printf("max=%d row=%d colum=%d ", max, row, colum);
return 0;
}
(3)地球矩陣編程視頻擴展閱讀
矩陣的分解:
1、LU分解(A = LU)
U是高斯消元結果,可視為對A左乘P進行行變換,PA = U,有A = P-1U,則行變換矩陣的逆即為L。L對角線上為1。
2、QR分解(A = QR)
Q是A正交化的結果,是A列空間的標准正交基,因為Q是以第一列為初始方向向量,對其他列向量進行變換,故R的第一列只有第一個元素有值,則R是上三角矩陣。a1 = R11 * q1,R11是一個數。
3、特徵值分解(A = SS-1)
S為特徵向量組成的矩陣,是特徵值組成的對角陣。前提條件:S可逆要求所有特徵向量線性無關。
若A為正定陣(光對稱不行,因為奇異值是非負的),則S為正交陣,此時A = SST,正好可看作奇異值分解,正交陣乘非負特徵值陣乘正交陣。
④ 任給出一個5*6的矩陣,編程求出其最大值和最小值
如用matlab來編程,以實現任給一個矩陣,求出其最大值和最小值,可以利用max()函數和min()函數,再加一個for循環語句去實現。
實現過程為
1、建立一個函數文件,如exfun(A),其內容
function [Amax,Amin]=exfun(A)
[m,n]=size(A);
B=[];C=[];
for i=1:m
B(i)=max(A(i,:));
C(i)=min(A(i,:));
end
Amin=min(C);Amax=max(B);
2、建立一個主程序,調用exfun(A)函數
A=floor(rand(5,6)*100) %隨機矩陣
[Amax,Amin]=exfun(A)
3、運行上述程序,可以得到如下結果。
⑤ 編程輸出下列矩陣: 13 14 15 16 9 10 11 12 5 6 7 8 1 2 3 4
#include<stdio.h>
#include<stdlib.h>
int main()
{int i,j,r=1,a[4][4];
for(i=0;i<4;i++)
for(j=0;j<4;j++)
a[i][j]=r++;
for(i=3;i>=0;i--)
{for(j=0;j<4;j++)
printf("%3d",a[i][j]);
printf("\n");}
system("pause");
return 0;
}
看看行不行,%&**&%
⑥ C語言:編程 矩陣
#include<stdio.h>
void main()
{ int a[4][2],b[2][4],i,j;
printf("鍵盤輸入一個4行2列的矩陣\n");
for(i=0;i<4;i++)
for(j=0;j<2;j++)
scanf("%d",&a[i][j]);//按樓主意願,並非定義同時初始化
for(i=0;i<4;i++)
for(j=0;j<2;j++)
b[j][i]=a[i][j];
for(i=0;i<2;i++)
{ for(j=0;j<4;j++)
printf("%d ",b[i][j]);
printf("\n");
}
}
⑦ 英飛拓監控矩陣鍵盤編程
C++ 實現。
#include <stdio.h>
#include <windows.h>
int Display();
int main()
{
Display();
return 0;
}
int Display()
{
SendMessage(FindWindow(0,0), WM_SYSCOMMAND, SC_MONITORPOWER, 1);
//關閉顯示器 根據MSDN,這個參數如果是1,則 表示顯示器處於低能耗狀態。
Sleep(10000);
SendMessage(FindWindow(0,0), WM_SYSCOMMAND, SC_MONITORPOWER, -1); //打開顯示器
return 0;
}
⑧ fortran編程 逆矩陣
以下是求5階方陣的逆矩陣,fortran77程序。供參考。
c 求逆矩陣
c 在主程序中,設兩個數組a(5,5),b(5,5)
c a(5,5)--存放5階方陣
c b(5,5)--存放單位陣
c 在子程序中,設一個數組c(5,10),該數組是a、b陣拼接起來的
c 要實現數組的拼接和拆分,用公用語句實現
reala(5,5),b(5,5)
common/x/a,b
do10i=1,5
do10j=1,5
if(i.eq.j)then
b(i,j)=1
else
b(i,j)=0
endif
10 continue
callinverse
write(*,20)b
write(*,*)
write(*,20)((b(i,j),j=1,5),i=1,5)
20 format(1x,5f10.3)
c read(*,*)
end
c************************************
subroutineinverse
realc(5,10)
common/x/c
do10k=1,5
do20j=10,k,-1
20 c(k,j)=c(k,j)/c(k,k)
do40i=1,5
if(i.ne.k)then
do30j=10,k,-1
30 c(i,j)=c(i,j)-c(i,k)*c(k,j)
endif
40 continue
10 continue
end
c******************************
blockdata
reala(5,5),b(5,5)
common/x/a,b
dataa/3,1,0,2,10,-2,0,1,3,1,9,3,1,0,1,
1 1,0,1,1,0,1,2,0,2,10/
end
⑨ 視頻矩陣的基本功能
視頻矩陣的主要功能是進行視頻信號的切換操作及控制,其本身是個復雜的計算機系統,還具有強大的附加功能,如視頻信號丟失檢測、分組、報警聯動、字元疊加等。具體如下;
1、視頻矩陣為視頻切換設備,矩陣系統中任一輸入圖像可以切換至任一輸出。
2、可以通過鍵盤或人機界面,實現對所有前端攝像機的各種控制功能。
3、視頻矩陣採用組合式結構,可進行積木式搭接,隨時擴充輸入輸出通道容量。
4、支持矩陣間的聯網,可通過建立雙向視頻干線實現矩陣間的互聯,形成一套完整的分布式矩陣系統。
5、可以對攝像機設置邏輯編號,並能按照攝像機的邏輯號選擇調用攝像機圖像。
6、具有多種復合控制功能,包括分組切換、宏控制、巡視等。
7、具有宏編程功能,對宏可設定按預定的時間序列和按照報警事件手動或自動執行。
8、可以控制輔助設備以增強系統功能,輔助設備包括報警輸入/輸出單元、干接點輸出控制單元、通信口擴展單元、通信轉換單元。
9、控制單元具有不間斷熱切換功能。原控制單元損壞時,備份控制單元能在線切換。可以接收其他系統[如門禁、周界報警、消防報警系統等]和設備(如圖形用戶界面、可編程邏輯控制器等)發來的事件信息來實現觸發報警、攝像機調用、聯動相應的操作一如使攝像機移動到預設位、控制輔助設備、執行宏操作等。
10、具有字元疊加功能,疊加項目至少包括年、月、日、時、分、秒、攝像機編號、攝像機注釋、攝像機標識、監視器編號,疊加的內容和疊加的位置可以編程選擇。
更多矩陣知識,請網路搜素「老向聊矩陣」大量免費視頻供您參考學習!
⑩ 編程,蛇形矩陣
C語言實現:
#include<stdio.h>
#define N 100 //給數組定義一個最大值
void main()
{
int n,i,j,k,s=1;
static int a[N][N];
printf("如果您想要得到逆的蛇形矩陣,輸入數字2,否則輸入任意數字:\n");
scanf("%d",&s);
printf("輸入矩陣階數:\n");
scanf("%d",&n); //鍵盤輸入矩陣階數
for(i=0;i<n;i++) //完成左邊斜上三角的賦值
{
for(j=0;j<n-i;j++)
{
k=i+j+1;
if(k%2==1) a[i][j]=k*(k-1)/2+i+1;
else a[i][j]=k*(k-1)/2+j+1;
}
}
for(i=1;i<n;i++) //完成左邊斜上三角的賦值
{
for(j=n-i;j<n;j++)
{
k=i+j+1;
if(k%2==1) a[i][j]=n*n-(2*n-k+1)*(2*n-k)/2+n-j;
else a[i][j]=n*n-(2*n-k+1)*(2*n-k)/2+n-i;
}
}
for(i=0;i<n;i++) //列印蛇形數組
{
for(j=0;j<n;j++)
{
if(s==2) a[i][j]=n*n-a[i][j]+1; //是否要得到逆蛇形矩陣的判斷和轉換語句
printf("%d\t",a[i][j]);
}
printf("\n");
}
}