Jiing’s Blog

Just another WordPress.com weblog

精通Matlab 6 第十四章 中譯

第十四章 集合、位元和基底函式(Sets, Bit, and Base Functions)

14.1 集合函式(SET FUNCTIONS)
因為陣列是數值的有序集合,它們可以被想成是集合論中的集合(sets)。有了此項認知,MATLAB提供數個函式來測試和比較集合。最簡單的測試就是測試二集合是否相等,例如,

>> a=rand(2,5); % 隨機陣列
>> b=randn(2,5); % 一個不同的陣列
>> isequal(a,b) % a和b並不相等
ans =
0
>> isequal(a,a) % 不過a確實等於a
ans =
1
>> isequal(a,a(:)) % a和變成一行的a
ans =
0

若兩個陣列要相等,它們必須有相同的維度和相同的內容。此函式可套用到所有MATLAB的資料型別,不只是數值陣列,例如,

>> a=&#039a string&#039
>> b=&#039a String&#039
>> isequal(a,b) % 測試字元字串是否相等
ans =
0
>> isequal(a,a)
ans =
1
>> a={&#039one&#039 &#039two &#039 &#039three&#039};
>> b={&#039one&#039 &#039two &#039 &#039four&#039};
>> isequal(a,b) % 測試巢狀陣列是否相等
ans =
0
>> isequal(a,a)
ans =
1

>> a.one=&#039one&#039
>> a.two=2;
>> a.three=pi;
>> b.two=2;
>> b.one=&#039one&#039
>> b.three=pi;
>> isequal(a,b) % 測試結構是否相等
ans =
0
>> isequal(a,a)
ans =
1

如果MATLAB變數有相同的大小且恰有相同的內容,則它們是相等的。如果兩個結構有相同的大小、它們有相同的內容,且以相同的次序建立欄位,則它們是相同的。
函式unique從已知集合中移除重複項(item):

>> A=[2:2:8;4:2:10] % 新資料
A =
2 4 6 8
4 6 8 10

>> unique(A) %獨一無二的元素被存在一行裡
ans =
2
4
6
8
10

unique會傳回已排序好的行向量,因為在重複值移除後不可能去維持陣列的維度。Unique也套用到字串的巢狀陣列,例如,

>> c={&#039Shania&#039 &#039Britney&#039 &#039Dixie&#039 &#039Shania&#039 &#039Faith&#039};
>> unique(c)
ans =
&#039Britney&#039 &#039Dixie&#039 &#039Faith&#039 &#039Shania&#039

函式ismember可以決定是否為集合的成員,例如,

>> a=1:9
a =
1 2 3 4 5 6 7 8 9
>> b=2:2:9
b =
2 4 6 8
>> ismember(a,b) % a中有哪些元素在b中
ans =
0 1 0 1 0 1 0 1 0
>> ismember(b,a) % b中有哪些元素在a中
ans =
1 1 1 1

對於向量引數,ismember會傳回與第一個引數同樣大小的邏輯陣列,此陣列以1s出現在二個向量有共同值的索引處。

>> A=eye(3); % 新資料
>> B=ones(3);
>> ismember(A,B) % 在A中的這些元素是否也在B中
ans =
1 0 0
0 1 0
0 0 1
>> ismember(B,A)
ans =
1 1 1
1 1 1
1 1 1 [譯者註]此處與原書不同

對於二維陣列ismember傳回一行向量,當二個引數有共同值時,此行量向中的1s會出現在第一個引數的單索引(single index)處。函式ismember也可以套用到字串的巢狀陣列上,例如,

>> ismember(c,&#039Dixie&#039)
ans =
0 0 1 0 0

集合的算術運算可以由函式union, intersect, setdiff和setxor來加以達成。以下是使用這些函式的範例。

>> a,b % 回憶起資料
a =
1 2 3 4 5 6 7 8 9
b =
2 4 6 8
>> union(a,b) % a和b的聯集(union)
ans =
1 2 3 4 5 6 7 8 9
>> intersect(a,b) % a和b的交集(intersection)
ans =
2 4 6 8
>> setxor(a,b) % a和b的set exclusive or
ans =
1 3 5 7 9
>> setdiff(a,b) % a和b的差集,在a中的值不在b中的
ans =
1 3 5 7 9
>> setdiff(b,a) % b和a的差集,在b中的值不在a中的
ans =
[]
>> union(A,B) % 矩陣輸入產生排序彎的行陣列[此處實驗結果與原書不同]

??? Error using ==> union
A and B must be vectors or &#039rows&#039 must be specified.
>> A
A =

1 0 0
0 1 0
0 0 1
>> B
B =
1 1 1
1 1 1
1 1 1

像在本章之前討論過的函式一樣,這些集合函式也可套用到字串的巢狀陣列上。

14.2 位元函式(BIT FUNCTIONS)

除了在上一章討論過的邏輯運算子外,MATLAB提供了在浮點整數上的個別位元或的邏輯運算的函式。因為MATLAB將所有的數值表為雙精度浮點數(IEEE算術運算,IEEE arithmetic),整數也被表為叫作是flints的浮點整數。結論是,IEEE算術運算相容的電腦可以獨一無二地表示從0到 -1的範圍的整數。MATLAB逐一位元的函式bitand, bitcmp, bitor, bitxor, bitset, bitget和bitshift可在此範圍的整數上作用。
使用位元運算子可表示的最大整數是bitmax,在可執行IEEE算術運算的電腦上也就是 -1。

>> format hex % 將格式改為16進位
>> bitmax
ans =
433fffffffffffff

下面是位元運算的範例。

>> a=(2^24)-1 % 資料
a =
416fffffe0000000
>> b=123456789 % 資料
b =
419d6f3454000000
>> bitand(a,b) % (a & b)
ans =
4156f34540000000
>> bitor(a,b) % (a | b)
ans =
419ffffffc000000
>> bitxor(a,b) % xor(a,b)
ans =
419e90cba8000000
>> bitcmp(0,10)
ans =
408ff80000000000
>> bitget(a,1) % 取出a的第一個bit
ans =
3ff0000000000000
>> bitset(a,30) % 將的第30個bit設為1
ans =
41c07fffff800000
>> format short g % 重新設定顯示的格式

14.3 基底的轉換(BASE CONVERSIONS)

MATLAB提供許多的公用函式來以字元字串的型式,轉換十進位數為其它基底的數。藉由執行函式dec2bin和bin2dec可進行介於十進位和二元數值間的轉換,例如,

>> a = dec2bin(17) % 找出17的二元表示法
a =
10001
>> class(a) % 結果是一個字元字串
ans =
char
>> bin2dec(a) % 轉回去成十進位數
ans =
17
>> class(ans) % 結果是個雙精度的十進位數
ans =
double

藉由執行dec2hex和hex2dec可進行介於十進位與十六進位間的轉換,如下例

>> a=dec2hex(2047) % 2047的十六進位表示法
a =
7FF
>> class(a) % 結果是個字元字串
ans =
char
>> hex2dec(a) % 轉回去成十進位數
ans =
2047
>> class(ans) % 結果是個雙精度的十進位數
ans =
double

藉由執行dec2base和base2dec可進行介於十進位與「任何介於2與36間的基底」的轉換,例如,

>> a=dec2base(26,3)
a =
222
>> class(a)
ans =
char
>> base2dec(a,3)
ans =
26

基底36是最大可用的基底,因為它使用數字0到9和字母A到Z來表示基底為36數的36個不同的數值。

—–

24 十二月, 2004 - Posted by | 精通Matlab 6

1 則迴響 »

  1. 这是我qq,请加我,我的问题qq是laugh,我想请教您

    迴響 由 格格 | 4 五月, 2009 | 回應


發表留言