matlab函式bsxfun的用法

2021-06-27 08:09:27 字數 2950 閱讀 8527

舉個例子。假設我們有一列向量和一行向量。

a = randn(3,1), b = randn(1,3) a = -0.2453 -0.2766 -0.1913 b = 0.6062 0.5655 0.9057

我們可以很簡單的使用matlab的外乘c=a*b

來得到,如圖

但如果我們想用」外加」呢?也就是說把上式求解過程中的乘號換做加號?

這時我們可以用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)

。這裡

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來實現,等效於for(i=1:3),for(j=1:3),c(i,j)=a(i)+b(j);end,end

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

>> c = bsxfun(@plus,a,b) c = 0.3609 0.3202 0.6604 0.3296 0.2889 0.6291 0.4149 0.3742 0.7144 >> 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 >> 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最好。

這裡@plus是加法的函式數柄,相應的有減法@minus, 乘法@times, 左右除等,具體可見 doc bsxfun.

下面看乙個更為實際的情況。假設我們有資料a和b, 每行是乙個樣本,每列是乙個特徵。我們要計算高斯核,既:

k(||x-xc||)=exp 其中xc為核函式中心,σ為函式的寬度引數 , 控制了函式的徑向作用範圍。

當然可以用雙重for實現(如果第一直覺是用三重for的話…)。

k1 = zeros(size(a,1),size(b,1)); for i = 1 : size(a,1) for j = 1 : size(b,1) k1(i,j) = exp(-sum((a(i,:)-b(j,:)).^2)/beta); end end

使用2,000×1,000大小的a和b, 執行時間為88秒。

考慮下面向量化後的版本:

sa = (sum(a.^2, 2)); sb = (sum(b.^2, 2)); k2 = exp(bsxfun(@minus,bsxfun(@minus,2*a*b', sa), sb')/beta);

使用同樣資料,執行時間僅0.85秒,加速超過100倍。

如要判斷兩者結果是不是一樣,可以如下

assert(all(all(abs(k1-k2)<1e-12)))

c = bsxfun(fun,a,b)

funto arrays 

aand 

b,with singleton expansion enabled.

funcan be oneof the following built-in functions:

@plus

plus

@minus

minus

@times

array multiply

@rdivide

right array divide

@ldivide

left array divide

@power

array power

@max

binary maximum

@min

binary minimum

@rem

remainder after division

@mod

modulus after division

@atan2

four quadrant inverse tangent

@hypot

square root of sum of squares

@eq

equal

@ne

not equal

@lt

less than

@le

less than or equal to

@gt

greater than

@ge

greater than or equal to

@and

element-wise logical and

@or

element-wise logical or

@xor

logical exclusive or

MATLAB中的bsxfun函式

bsxfun 函式的功能 兩個陣列間元素逐個計算的二值操作。函式使用方法 z bsxfun fun,x,y 兩個陣列x合y間元素逐個計算的二值操作,fun是函式控制代碼或者m檔案,也可以如下內建函式。常見的內建函式如下 plus 加 minus 減 times 陣列乘 rdivide 左除 ldiv...

matlab學習筆記 bsxfun函式

matlab學習筆記 bsxfun函式 最近總是遇到bsxfun這個函式,前幾次因為無關緊要只是大概看了一下函式體去對比結果,今天再一次遇見了這個函式,想想還是有必要掌握的,遂查了些資料總結如下。函式bsxfun 功能描述 兩個陣列間元素逐個計算.應用場合 當我們想對乙個矩陣a的每一列或者每一行與同...

matlab學習筆記 bsxfun函式

matlab學習筆記 bsxfun函式 最近總是遇到bsxfun這個函式,前幾次因為無關緊要只是大概看了一下函式體去對比結果,今天再一次遇見了這個函式,想想還是有必要掌握的,遂查了些資料總結如下。函式bsxfun 功能描述 兩個陣列間元素逐個計算.應用場合 當我們想對乙個矩陣a的每一列或者每一行與同...