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];example2:假設我們有一列向量和一行向量。acol = bsxfun(@times,a,[1 2 4])
[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 ...