關于matlab中bitget函數使用規則的一次小探索
- 1、問題提出
- 2、查閱資料
- 3、硬着頭皮的探索
- 4、歸納
- 5、結論
在用matlab進行數字圖像處理程式設計仿真時同學問到了我bitget函數,不巧,對出現的問題我也十分不清楚(問題應該很簡單但奈何我水準頗羞),上網查閱資料後,有些許明朗,遂決定總結一下,記錄分享于此。
1、問題提出
temp是一個10*10矩陣:
temp =
10×10 uint8 矩陣
64 49 45 40 45 66 86 78 60 40
43 43 41 37 40 41 49 44 45 39
40 40 41 39 42 41 40 38 36 36
39 38 39 39 45 38 42 42 40 47
38 37 37 36 39 41 47 62 53 42
36 35 37 37 57 48 75 94 87 71
36 36 40 43 51 68 113 139 125 116
38 56 48 53 72 102 140 176 175 153
31 64 65 50 66 96 153 186 188 171
29 41 68 50 39 54 141 189 188 183
在讀取此矩陣低兩位時應用了以下語句:
bitget(temp,1:2)%希望輸出矩陣每個元素低二位 (1)
程式報錯:
此處“對于各個輸入的大小必須相同”很不了解,因為:
将語句(1)改為以下語句時程式正常運作:
Q=bitget(temp,1)%輸出低1位 (2)
T=bitget(temp,2)%輸出低2位
Q =
10×10 uint8 矩陣
0 1 1 0 1 0 0 0 0 0
1 1 1 1 0 1 1 0 1 1
0 0 1 1 0 1 0 0 0 0
1 0 1 1 1 0 0 0 0 1
0 1 1 0 1 1 1 0 1 0
0 1 1 1 1 0 1 0 1 1
0 0 0 1 1 0 1 1 1 0
0 0 0 1 0 0 0 0 1 1
1 0 1 0 0 0 1 0 0 1
1 1 0 0 1 0 1 1 0 1
T =
10×10 uint8 矩陣
0 0 0 0 0 1 1 1 0 0
1 1 0 0 0 0 0 0 0 1
0 0 0 1 1 0 0 1 0 0
1 1 1 1 0 1 1 1 0 1
1 0 0 0 1 0 1 1 0 1
0 1 0 0 0 0 1 1 1 1
0 0 0 1 1 0 0 1 0 0
1 0 0 0 0 1 0 0 1 0
1 0 0 1 1 0 0 1 0 1
0 0 0 1 1 1 0 0 0 1
此處輸入大小也不相同為何未報錯?
并且運作下列語句程式亦未報錯:
K>> bitget(8,1:3) %輸出8的低三位 (3)
ans =
0 0 0
想來或許是自己對大小相同了解有誤?或許并非指輸入的size相同?
2、查閱資料
+ 通過在matlab 使用help指令得到:
K>> help bitget
bitget Get bit.
C = bitget(A,BIT) returns the value of the bit at position BIT in A,
where A is a signed or unsigned integer array. BIT must be between 1
(least significant bit) and the number of bits in the integer
class of A e.g., 32 for UINT32s or INT32s (most significant bit). If A
is a double array, then all elements must be non-negative integers
less than or equal to intmax('uint64'), and BIT must be between
1 and 64.
C = bitget(A,BIT,ASSUMEDTYPE) assumes A is of type ASSUMEDTYPE. If A is
a double array, ASSUMEDTYPE can be 'int8', 'uint8', 'int16', 'uint16',
'int32', 'uint32', 'int64', or 'uint64' (the default). For example,
bitget(A,BIT,'int8') is equivalent to double(bitget(int8(A),BIT)). All
elements in A must have integer values within the range of ASSUMEDTYPE.
If A is of an integer type, then ASSUMEDTYPE must be this type.
Example:
Prove that INTMAX sets all the bits to 1:
a = intmax('uint8')
if all(bitget(a,1:8)), disp('All the bits have value 1.'), end
大體說了A和bit的取值類型以及取值範圍,即:
- b = bitget(A,bit) 傳回整數數組 A 中位于位置 bit 的位值。
- 如果 A 為雙精度數組,并且未指定 assumedtype,則 MATLAB® 會将 A 視為無符号的 64 位整數。
- 如果已指定 assumedtype,A 中的所有元素必須是 assumedtype 類型範圍内的整數值。
-
bit 必須介于 1(最低有效位)和 A 的整數類中的位數之間。
仍未解決前面的疑惑,去參考頁看看:
着重看了輸入參數部分: 我了解為兩個輸入可以是整數可以是數組,是數組時兩者大小需要相同,仍不解前面的例子(2)(3)與報錯所顯示的輸入大小必須相同. - 想來可能是中文了解不準确,看英文解釋: 即:
A:bit:
- Input values, specified as an array. A can be a scalar or an array of the same size as bit.
- Bit position, specified as an integer or integer array. bit can be a scalar or an array of the same size as A. bit must be between 1 (the least-significant bit) and the number of bits in the integer class of A.
得知當bit或A為數組時,兩者大小需相等。
- 看來确實是說要size相同,但仍不解報錯提示的“輸入大小必須相同”,決定利用open或edit檢視bitget源代碼,發現無法打開。
3、硬着頭皮的探索
查閱資料未果後,開始硬着頭皮去程式設計探索解釋:
要求A與bit大小相同,是以建立了一個同等大小的ones作為bit輸入發現與輸入1時相等:
bitget(temp,ones(10))==bitget(temp,1)
ans =
10×10 logical 數組
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
似乎有點明白了,這好像确實是一個很簡單的問題,但對于剛剛的我來說卻是不簡單……
4、歸納
由于無法檢視源代碼,是以自己生硬的歸納了一下:
- bitget(A,bit) 傳回整數數組 A 中位于位置 bit 的位值。即:
- bitget( a , m : n ); 将十進制整數a轉換為二進制,輸出從低 m 位到 n 位的數字(注意m,n 必須介于 1(最低有效位)和 a 的整數類中的位數之間。))
- bitget( a , bit); 将十進制整數a轉換為二進制,輸出低bit位數字(注意bit 必須介于 1(最低有效位)和 a 的整數類中的位數之間。))
- bitget( array , bit); 将array中十進制整數轉換為二進制,依次輸出每一個二進制數的低bit位(注意bit 必須介于 1(最低有效位)和 A 的整數類中的位數之間。)
- bit(array,array1); 将array中十進制整數轉換為二進制,對應于array1以此輸出array(i)中低array1(i)位。注意array和array1大小(size)需相同
5、結論
個人見解:關于兩輸入參數大小相同指的是當兩個輸入都是數組時大小(size)應相同而不是任何時候都應大小(size)相同
本人系初學者,未能檢視函數源代碼所定義内容、上述所寫僅為學習記錄及學習分享,可能跟實際情況存在出入,以上皆為個人見解,如有錯誤,歡迎指正交流。
歡迎關注微信公衆号痕中光一起學習進步