天天看点

关于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)相同

本人系初学者,未能查看函数源代码所定义内容、上述所写仅为学习记录及学习分享,可能跟实际情况存在出入,以上皆为个人见解,如有错误,欢迎指正交流。

欢迎关注微信公众号痕中光一起学习进步

继续阅读