天天看點

關于matlab中bitget函數使用規則的一次小探索1、問題提出2、查閱資料3、硬着頭皮的探索4、歸納5、結論

關于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)
           

程式報錯:

關于matlab中bitget函數使用規則的一次小探索1、問題提出2、查閱資料3、硬着頭皮的探索4、歸納5、結論

此處“對于各個輸入的大小必須相同”很不了解,因為:

将語句(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 的整數類中的位數之間。

    仍未解決前面的疑惑,去參考頁看看:

    關于matlab中bitget函數使用規則的一次小探索1、問題提出2、查閱資料3、硬着頭皮的探索4、歸納5、結論
    關于matlab中bitget函數使用規則的一次小探索1、問題提出2、查閱資料3、硬着頭皮的探索4、歸納5、結論
    關于matlab中bitget函數使用規則的一次小探索1、問題提出2、查閱資料3、硬着頭皮的探索4、歸納5、結論
    關于matlab中bitget函數使用規則的一次小探索1、問題提出2、查閱資料3、硬着頭皮的探索4、歸納5、結論
    着重看了輸入參數部分:
    關于matlab中bitget函數使用規則的一次小探索1、問題提出2、查閱資料3、硬着頭皮的探索4、歸納5、結論
    關于matlab中bitget函數使用規則的一次小探索1、問題提出2、查閱資料3、硬着頭皮的探索4、歸納5、結論
    我了解為兩個輸入可以是整數可以是數組,是數組時兩者大小需要相同,仍不解前面的例子(2)(3)與報錯所顯示的輸入大小必須相同.
  • 想來可能是中文了解不準确,看英文解釋:
    關于matlab中bitget函數使用規則的一次小探索1、問題提出2、查閱資料3、硬着頭皮的探索4、歸納5、結論
    即:
A:
  • Input values, specified as an array. A can be a scalar or an array of the same size as bit.
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)相同

本人系初學者,未能檢視函數源代碼所定義内容、上述所寫僅為學習記錄及學習分享,可能跟實際情況存在出入,以上皆為個人見解,如有錯誤,歡迎指正交流。

歡迎關注微信公衆号痕中光一起學習進步

繼續閱讀