matlab學習筆記 bsxfun函式

2022-03-15 21:34:08 字數 2847 閱讀 3181

matlab學習筆記 bsxfun函式

最近總是遇到bsxfun這個函式,前幾次因為無關緊要只是大概看了一下函式體去對比結果,今天再一次遇見了這個函式,想想還是有必要掌握的,遂查了些資料總結如下。

函式bsxfun

【功能描述】兩個陣列間元素逐個計算.

【應用場合】當我們想對乙個矩陣a的每一列或者每一行與同乙個長度相等的向量a進行某些操作(比較大小,乘除等)時,我們只能用迴圈方法或者利用repmat函式將要操作的向量a複製成和a一樣尺寸的矩陣,進而進行操作。從matlab r2007a開始,再遇到類似的問題時,我們有了簡潔高效的方法,即利用bsxfun函式。

【函式描述】c=bsxfun(fun,a,b):兩個陣列間元素逐個計算,fun是函式控制代碼或者m檔案,也可以為如下內建函式 :

@plus 加 ;         @minus 減 ;         @times 陣列乘 ;         @rdivide 左除 ;        @ldivide 右除 。

example1:將乙個矩陣的每行或每列元素分別擴大不同的倍數

如[1 2 3;4 5 6 ;7 8 9],第一列元素乘以1,第二列元素以2,第三列元素乘以4。利用bsxfun函式,可以給出下列**:

[plain]view plain

copy

a = [1,2,3;4,5,6;7,8,9];  

acol = bsxfun(@times,a,[1 2 4])  

example2:假設我們有一列向量和一行向量。

[plain]view plain

copy

a = randn(3,1);  

b = randn(1,3);  

a =  

0.7516  

-0.8637  

-1.0709  

b =  

-0.3552    0.9559    0.1593  

我們可以很簡單的使用matlab的外乘來得到c=a*b,
[plain]view plain

copy

c = a * b  

c =  

-0.2670    0.7184    0.1197  

0.3068   -0.8256   -0.1376  

0.3804   -1.0236   -0.1706  

但如果我們想用」外加」呢?也就是說把上式求解過程中的乘號換做加號?這時我們可以用c=bsxfun(@plus,a,b)來實現。
bsxfun的執行是這樣的:如果a和b的大小相同,那麼c=a+b; 但如果有某維不同,且a或b必須有乙個在這一維的維數為1, 那麼bsxfun就將少的這個虛擬的複製一些來使與多的維數一樣。在我們這裡,b的第一維只有1(只一行),所以bsxfun將b複製3次形成乙個3×3的矩陣,同樣也將a複製成3×3的矩陣。這個等價於c=repmat(a,1,3)+repmat(b,3,1)。這裡,
[plain]view plain

copy

repmat(a,1,3)   

ans =   

-0.2453 -0.2453 -0.2453   

-0.2766 -0.2766 -0.2766   

-0.1913 -0.1913 -0.1913  

repmat是顯式的複製,當然帶來記憶體的消耗。而bsxfun是虛擬的複製,實際上通過for來實現,等效於:
[plain]view plain

copy

for(i=1:3)  

for(j=1:3)  

c(i,j)=a(i)+b(j);  

end  

end  

但bsxfun不會有使用matlab的for所帶來額外時間。實際驗證下這三種方式:
[plain]view plain

copy

>> c = bsxfun(@plus,a,b)   

c =   

0.3609 0.3202 0.6604   

0.3296 0.2889 0.6291   

0.4149 0.3742 0.7144   

[plain]view plain

copy

>> c = repmat(a,1,3)+repmat(b,3,1)   

c =   

0.3609 0.3202 0.6604   

0.3296 0.2889 0.6291   

0.4149 0.3742 0.7144   

[plain]view plain

copy

>> for(i=1:3)  

for(j=1:3)  

c(i,j)=a(i)+b(j);  

end  

end  

>> c   

c =   

0.3609 0.3202 0.6604   

0.3296 0.2889 0.6291   

0.4149 0.3742 0.7144  

從計算時間上來說前兩種實現差不多,遠高於for的實現。但如果資料很大,第二種實現可能會有記憶體上的問題。所以bsxfun最好。
參考:

matlab學習筆記

一致化矩陣 z1 1 2 4 3 4 1 z2 1 2 2 5 6 1 b 0 1 q 3 z concur b,q 向量之和 x1 netsum z1,z2 向量之積 x2 netprod z1,z2 感知器神經網路,完成 或 的計算 err goal 0.001 max epoch 500 x ...

MATLAB學習筆記

1.自由探索之恢復 如果不小心關閉了當前路徑視窗 命令歷史記錄視窗或命令視窗,可以通過選單欄的 desktop 選單中 desktoplayout default 恢復。2.開啟簡單的圖形視窗 在命令視窗中的 後面輸入 funtool 並按回車鍵。3.注釋 命令列中的百分號 起注釋的作用,matla...

matlab學習筆記

最近要做 了,菜鳥也得學習matlab了,也不知道怎麼開始學習,就還是使用例子來學習所有的知識吧。然後遇到的問題在這記下來,也算是做筆記,加深印象吧。1 mat l a b繪製一條引數曲線 x cost sin3t y sintcost cos3t 解答 首先定義t的範圍t 0 pi pi 100 ...