a = [1 2 3; 4 5 6; 7 7 8];b = [1 2 2; 2 3 4];A = prod(a,2)';B = prod(b,2)';[ma,n] = size(a);[mb,n] = size(b);R = zeros(mb,ma);for r = 1:mb R(r,:) = B(r)*A;endR R = 24 480 1568 144 2880 9408
矩陣分析可以解決很多問題,但很多時(shí)候矩陣的運(yùn)算比較繁瑣,特別是高階矩陣運(yùn)算。這時(shí)候如果用matlab來計(jì)算就方便快捷得多。下面就為大家介紹怎么用matlab進(jìn)行矩陣運(yùn)算的步驟
首先可以求點(diǎn)乘,維數(shù)肯定要相同; “.*”和“*”的區(qū)別: 在進(jìn)行數(shù)之間的運(yùn)算時(shí)“.*”和“*”是沒有區(qū)別的,都是表示普通的乘法運(yùn)算。例:m = 2,n = 3,m.*n = 6, m*n = 6。 在進(jìn)行矩陣之間的運(yùn)算時(shí)“.*”和“*”的意義就有所不同了。假設(shè)a,b表示兩個(gè)矩
約定:
a=[1,3,5;2,4,6;7,9,8] b=[9,6,4;3,4,5;2,3,4]
用xor函數(shù),比如xor(A,B) 參看http://www.mathworks.com/help/matlab/ref/xor.html?refresh=true
材料/工具
matlab
1,收先打開Matlab軟件,在軟件界右側(cè)點(diǎn)擊鼠標(biāo)右鍵,選擇“new file”,點(diǎn)擊“script”新建一個(gè)文件: 2、在腳本里隨意輸入一個(gè)簡單的矩陣,matlab里矩陣轉(zhuǎn)置實(shí)現(xiàn)起來比較容易,只需要通過英文的單引號就能實(shí)現(xiàn)轉(zhuǎn)置操作: 3、按回車鍵之后,就可以看
方法
加和減:
加減法的命令很簡單,直接用加或者減號就可以了。如:c=a+b d=a-b
你不可以這么寫。首先必須將A轉(zhuǎn)化為syms,所以你應(yīng)該這么寫 >>A=sym(A); >>syms a >>A(1,1)=a; 這樣再試試呢?
乘法:
一般乘法:c=a*b,要求a的列數(shù)等于b的行數(shù)。
加和減: 加減法的命令很簡單,直接用加或者減號就可以了。如: c=a+b d=a-b 乘法: 一般乘法:c=a*b,要求a的列數(shù)等于b的行數(shù)。 如果a,b是一般的向量,如a=[1,2,3] b=[3,4,5] 點(diǎn)積: dot(a,b), 叉積: cross(a,b) 卷積: conv(a,b) 除法:一般
如果a,b是一般的向量,如a=[1,2,3] b=[3,4,5]
矩陣沒有指數(shù)和對數(shù)運(yùn)算 數(shù)組運(yùn)算:.^(指數(shù))是對應(yīng)元素的運(yùn)算,與矩陣運(yùn)算完全不同。 矩陣運(yùn)算:+ - * / -1(求逆) 等運(yùn)算
點(diǎn)積:dot(a,b),
此題考查特征值的性質(zhì) 用常用性質(zhì)解此題: 1.A的行列式等于A的全部特征值之積 所以 |A| = -1*1*2 = -2 2.若a是可逆矩陣A的特征值,則 |A|/a 是A*的特征值 所以A*的特征值為 2,-2,-1 所以|A*| = 2*(-2)*(-1) = 4. 注:當(dāng)然也可用伴隨矩陣的行列式性
叉積:cross(a,b)
轉(zhuǎn)自知乎: 原帖鏈接:http://www.zhihu.com/question/19706331 MATLAB的矩陣計(jì)算使用的是Intel自己出的Math kernel library(MKL),這個(gè)庫遠(yuǎn)比其他的blas/lapack庫要快。C快在循環(huán),要想矩陣計(jì)算也和MATLAB一樣快,那就得鏈接MKL,寫起來免不了
卷積: conv(a,b)
轉(zhuǎn)自知乎: 原帖鏈接:http://www.zhihu.com/question/19706331 MATLAB的矩陣計(jì)算使用的是Intel自己出的Math kernel library(MKL),這個(gè)庫遠(yuǎn)比其他的blas/lapack庫要快。C快在循環(huán),要想矩陣計(jì)算也和MATLAB一樣快,那就得鏈接MKL,寫起來免不了
除法:一般在解線性方程組時(shí)會用到。
要計(jì)算三維矩陣每一層的norm的話,用for是比較合適的,如果必須不用for的話,你可以試試這個(gè)流程: >> a = randn( 2, 2, 3 ) a(:,:,1) = 0.3129 -0.0301 -0.8649 -0.1649 a(:,:,2) = 0.6277 1.1093 1.0933 -0.8637 a(:,:,3) = 0.0774 -1.1135 -1
x=ab 如果ax=b,則 x=ab是矩陣方程的解。
pa = prod(a, 2);pb = prod(b, 2);repmat(pa', numel(pb), 1) - repmat(pb, 1, numel(pa))
x=b/a 如果xa=b,則x=b/a是矩陣方程的解。
對于使用變量的矩陣運(yùn)算,首先必須要定義變量名稱,在Matlab中通過使用syms來定義非常方便,通過運(yùn)算后將變量替換為具體的數(shù)值,下面為具體的一個(gè)實(shí)例: 1.定義變量 syms x y z; 2.定義矩陣 R1=[cos(x) -sin(x) 0;sin(x) cos(x) 0;0 0 1]; R2=[
轉(zhuǎn)置:
轉(zhuǎn)置時(shí),矩陣的第一行變成第一列,第二行變成第二列,。。。
首先,肯定是算法上的優(yōu)化,它沒有直接按照定義去做乘,而是先對矩陣做了一些變換再乘,目的就是減少重復(fù)運(yùn)算的次數(shù)。關(guān)于這個(gè),你可以去看下Knuth的The art of programming的第一卷,那里面有例子說明怎樣算最快; 其次,如果你想看些原代碼,
x=a.'
求逆:
要求矩陣為方陣。x=inv(a)
可以這樣,m文件不應(yīng)該聲明為函數(shù),也就是上面沒有聲明function的才可以,三個(gè)文件均作為命令腳本運(yùn)行,這樣運(yùn)算的東西都會放到工作區(qū)當(dāng)中,先執(zhí)行T1再執(zhí)行T2 T3就可以了 如果已經(jīng)是m文件函數(shù)的形式可以用global的方法將變量導(dǎo)出
擴(kuò)展閱讀,以下內(nèi)容您可能還感興趣。
如何寫出比 MATLAB 更快的矩陣運(yùn)算程序
轉(zhuǎn)自知乎:
原帖鏈接:http://www.zhihu.com/question/19706331
MATLAB的矩陣計(jì)算使用的是Intel自己出的Math kernel library(MKL),這個(gè)庫遠(yuǎn)比其他的blas/lapack庫要快。C快在循環(huán),要想矩陣計(jì)算也和MATLAB一樣快,那就得鏈接MKL,寫起來免不了各種折騰。而且,即使你鏈接上了,編譯時(shí)各種優(yōu)化選項(xiàng)之類的還是比不上人家專業(yè)的設(shè)定,速度很難接近MATLAB。
我自己在Gentoo上試過源里的所有blas/lapack庫,無一能與MKL匹敵,而且連接近都不可能。甚至我把python的NumPy庫鏈接上MKL后,速度也只是勉強(qiáng)接近。由于Gentoo的MKL庫永遠(yuǎn)是最新的,而每一個(gè)新版本的MKL庫對矩陣計(jì)算都有略微提升,導(dǎo)致可能暫時(shí)NumPy與MATLAB可以匹敵。但是一旦更新版本的MATLAB出來后,它會使用上更新的MKL庫,這種領(lǐng)先優(yōu)勢就又喪失殆盡。你可以在MATLAB文檔搜索中輸入MKL,這樣會被定位到MATLAB release notes,而里面就會含有這么一句話“Upgrade to Intel Math Kernel Libraries”,這就是每一個(gè)版本MATLAB矩陣計(jì)算都越發(fā)*快的原因。
當(dāng)然,剛我提到的python,其矩陣計(jì)算速度雖然微微落后于MATLAB,但是在很多其他地方是可以大大強(qiáng)于MATLAB的。例如繪制大規(guī)模三維點(diǎn)云,以及輕松調(diào)用gpu之類的。因此python在矩陣計(jì)算的微小速度劣勢完全可以忽略,可以考慮用于科學(xué)計(jì)算。
Matlab 三維矩陣操作怎樣用矩陣運(yùn)算代替for循環(huán)
要計(jì)算三維矩陣每一層的norm的話,用for是比較合適的,如果必須不用for的話,你可以試試這個(gè)流程:
>> a = randn( 2, 2, 3 )
a(:,:,1) =
0.3129 -0.0301
-0.8649 -0.1649
a(:,:,2) =
0.6277 1.1093
1.0933 -0.8637
a(:,:,3) =
0.0774 -1.1135
-1.2141 -0.0068
>> a1 = cellfun( @( x ) norm( x ), num2cell( a, [ 1 2 ] ) );
>> a1 = a1( : )
a1 =
0.9312
1.4482
1.2260
思路就是把三維矩陣轉(zhuǎn)為一個(gè)元胞序列,元胞里的每個(gè)元素就是原始矩陣的每一層,然后利用cellfun函數(shù)進(jìn)行批量計(jì)算。
怎么用MATLAB實(shí)現(xiàn)兩個(gè)矩陣之間的運(yùn)算
pa = prod(a, 2);
pb = prod(b, 2);
repmat(pa', numel(pb), 1) - repmat(pb, 1, numel(pa))
matlab中怎么用將矩陣當(dāng)成自變量帶入函數(shù)運(yùn)算?
對于使用變量的矩陣運(yùn)算,首先必須要定義變量名稱,在Matlab中通過使用syms來定義非常方便,通過運(yùn)算后將變量替換為具體的數(shù)值,下面為具體的一個(gè)實(shí)例:
1.定義變量
syms x y z;
2.定義矩陣
R1=[cos(x) -sin(x) 0;sin(x) cos(x) 0;0 0 1];
R2=[cos(y) 0 sin(y);0 1 0;-sin(y) 0 cos(y)];
R3=[1 0 0;0 cos(z) -sin(z);0 sin(z) cos(z)];
3.求解矩陣
a=R1*R2*R3
4.變量替換
subs(a,{x,y,z},{0,pi/2,0})
則能夠直接求解出矩陣a的具體值。
完整的程序如下,直接保存為.m文件可以直接運(yùn)行:
syms x y z;
R1=[cos(x) -sin(x) 0;sin(x) cos(x) 0;0 0 1];
R2=[cos(y) 0 sin(y);0 1 0;-sin(y) 0 cos(y)];
R3=[1 0 0;0 cos(z) -sin(z);0 sin(z) cos(z)];
a=R1*R2*R3;
subs(a,{x,y,z},{0,pi/6,pi/3})
PS:關(guān)于subs函數(shù)的使用 subs(f,{old},{new});
其中f是關(guān)于old的變量函數(shù),new為具體的數(shù)值
matlab 矩陣快速運(yùn)算是怎么實(shí)現(xiàn)的
首先,肯定是算法上的優(yōu)化,它沒有直接按照定義去做乘,而是先對矩陣做了一些變換再乘,目的就是減少重復(fù)運(yùn)算的次數(shù)。關(guān)于這個(gè),你可以去看下Knuth的The art of programming的第一卷,那里面有例子說明怎樣算最快;
其次,如果你想看些原代碼,貌似matlab在很久前就開始用LAPACK這個(gè)數(shù)學(xué)包了,LAPACK是開源的,是個(gè)數(shù)*算的包。你可以google下。
最后,stackexchange上有差不多的問題,比較了下各語言的速度,我給你粘貼下。
1024x1024 2048x2048 4096x4096
--------------- -------------- ---------------
CUDA C (ms) 43.11 391.05 3407.99
C++ (ms) 6137.10 64369.29 551390.93
C# (ms) 10509.00 300684.00 2527250.00
Java (ms) 9149.90 92562.28 838357.94
MATLAB (ms) 75.01 423.10 3133.90
當(dāng)然上面的C++用的算法我猜是按定義直接算的。
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com