考虑以下数组:
>> a=[26;94;32];
>> b=dec2bin(a,8);
>> c=str2num(b);
>> d1=bitget(c,1);
>> d2=bitget(c,2);
>> d3=bitget(c,3);
>> d4=bitget(c,4);
>> d5=bitget(c,5);
>> d6=bitget(c,6);
>> d7=bitget(c,7);
>> d8=bitget(c,8);
>> e1=bitget(a,1);
>> e2=bitget(a,2);
>> e3=bitget(a,3);
>> e4=bitget(a,4);
>> e5=bitget(a,5);
>> e6=bitget(a,6);
>> e7=bitget(a,7);
>> e8=bitget(a,8);
我希望这些结果来自代码:
d1 = e1
d2 = e2
d3 = e3
d4 = e4
d5 = e5
d6 = e6
d7 = e7
d8 = e8
但实际上我们有结果:
d1 = e1
d2 = e2
d3 = e3
d4 != e4
d5 != e5
d6 != e6
d7 != e7
d8 != e8
你能告诉我为什么吗?
实际上我想在数组的不同列或不同的列数组中分别写入b或c的位,并将其用于位平面切片。
我不想直接使用bitget
(这是我的图像处理课程的家庭作业,教授强调不直接使用matlab图像处理功能)。你能否告诉我如何在不降低代码速度的情况下做到这一点?
答案 0 :(得分:1)
b
位到双数组中?试试这个 -
c = b-'0'
答案 1 :(得分:1)
基本上有可能做你想做的事。
b = dec2bin(a,8)
c = b-'0'
将返回:
c =
0 0 0 1 1 0 1 0
0 1 0 1 1 1 1 0
0 0 1 0 0 0 0 0
但这不是Matlab内部使用位数组的方式,而是假设一个"镜像"比特方向。
要实现这一目标,您只需使用de2bi
:
c = de2bi(a,8)
会给你:
c =
0 1 0 1 1 0 0 0
0 1 1 1 1 0 1 0
0 0 0 0 0 1 0 0
这些数组现在适用于函数bitget
,它也适用于这个"镜像"取向。这就是你得错的结果。
因此,对于第二种解决方案,比较工作正常:
d6 = c(:,6)
e6 = bitget(a,6)
d6 =
0
1
0
e6 =
0
1
0
不幸的是de2bi
需要通信系统工具箱,如果您没有,则需要将Divakars解决方案调整为:
b = dec2bin(a,8)
c = fliplr(b-'0')
最终比较:
e = [ bitget(a,1),bitget(a,2),bitget(a,3),bitget(a,4), ...
bitget(a,5),bitget(a,6),bitget(a,7),bitget(a,8) ]
comp = all( c == e ,3 )
comp =
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1