Matlab中bsxfun和unique函式解析

2022-01-24 06:03:41 字數 2023 閱讀 4399

來自於乙份lsh**,記錄下來。

函式用在

兩個陣列間元素逐個計算。比如

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

格式 b = unique (a) %取集合a的不重複元素構成的向量。

b = unique (a,'rows') %返回a、b不同行元素組成的矩陣。

我發現b中內容由小到大排序了。

[b,i,j] = unique (…) %i體現b中元素在原向量(矩陣a)中的位置;j體現原向量(矩陣a)在b中的位置

參考文獻:

舉個例子。假設我們有一列向量和一行向量。a = randn(3,1), b = randn(1,3),我們可以很簡單的使用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是顯式的複製,當然帶來記憶體的消耗。而bsxfun是虛擬的複製,實際上通過for來實現,等效於for(i=1:3),for(j=1:3),c(i,j)=a(i)+b(j);end,end。但bsxfun不會有使用matlab的for所帶來額外時間。

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

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

@plus

@minus

@times

@rdivide

@ldivide

@power

@max

@min

@rem

@mod

@atan2

@hypot

@eq@ne

@lt@le

@gt@ge

@and

@or@xor

參考文獻

>> a=[1 1 2 2 4 4 6 4 6]

a =1 1 2 2 4 4 6 4 6

>> [c,i,j]=unique(a)

c =1 2 4 6

i =2 4 8 9 %i體現b中元素在原向量(矩陣a)中的位置;

j =1 1 2 2 3 3 4 3 4 %j體現原向量(矩陣a)在b中的位置

例1-40

>> a=[1 2 2 4;1 1 4 6;1 1 4 6]

a =1 2 2 4

1 1 4 6

1 1 4 6

>> [c,i,j]=unique(a,'rows')

c =1 1 4 6

1 2 2 4

i =3

1j =21

1如何將乙個矩陣的每行或每列元素分別擴大不同的倍數?如[1 2 3;4 5 6 ;7 8 9],第一列元素乘以1,第二列元素以2,第三列元素乘以4。

利用bsxfun函式,可以給出下列**:

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

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

MATLAB中的bsxfun函式

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

matlab函式bsxfun的用法

舉個例子。假設我們有一列向量和一行向量。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 來得到,如圖 但如果我們想用 外加 呢?也就是說把上式求解過程中的乘號...

matlab學習筆記 bsxfun函式

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