Matlab:检查二进制数中活动位的命令?
这就是我如何处理存储二进制文件的数组Matlab:检查二进制数中活动位的命令?,matlab,math,binary,Matlab,Math,Binary,这就是我如何处理存储二进制文件的数组 >> hhh=[1 0 1 0 1 0 0; 0 0 1 0 0 0 0; 1 0 1 0 0 0 0; 0 0 0 1 1 0 1]; find(hhh(:,1)==1) ans = 1 3 现在我正试图理解如何用二进制数来做 >> hhhh=[1010100; 0010000; 1010000; 0001101]; find(hhhh(:,1)==1) ans = Empty matrix: 0
>> hhh=[1 0 1 0 1 0 0; 0 0 1 0 0 0 0; 1 0 1 0 0 0 0; 0 0 0 1 1 0 1]; find(hhh(:,1)==1)
ans =
1
3
现在我正试图理解如何用二进制数来做
>> hhhh=[1010100; 0010000; 1010000; 0001101]; find(hhhh(:,1)==1)
ans =
Empty matrix: 0-by-1
将所有二进制文件分解回数组的方法可以奏效(ismember('101010','1'),然后用零作为前缀),但我觉得可能有更好的选择
用哪个命令检查二进制数中的第n位是否有效?
还有一个更难的谜题:是否有一种类型不可知的解决方案可以同时使用二进制和DEC?您应该将二进制数存储为字符串矩阵:
hhhh=['1010100'; '0010000'; '1010000'; '0001101'];
那你就可以了
find(bin2dec(hhhh) >= bin2dec('1000000'))
返回:
ans =
1
3
或者你可以使用不那么直观的(但可能更快)
要获得相同的结果。您应该将二进制数存储为字符串矩阵:
hhhh=['1010100'; '0010000'; '1010000'; '0001101'];
那你就可以了
find(bin2dec(hhhh) >= bin2dec('1000000'))
返回:
ans =
1
3
或者你可以使用不那么直观的(但可能更快)
以获得相同的结果。字符串输入
如果您有一个字符串输入,您可以通过测试char
equality:
find(hhh(:, 1) == '1')
对于字符串数组(即char
矩阵),您可以提取find
(行和列)的两个输出,以确定哪个活动位对应于哪个字符串:
[r, c] = find(hhh == '1');
数字输入
对于数字输入,可以使用获取二进制表示形式。因此,它与字符串输入的解决方案非常相似:
B = bsxfun(@bitget, hhh, size(hhh, 1):-1:1);
[r, c] = find(B);
请注意,find
搜索非零元素,因此无需显式编写find(B==1)
组合溶液
如果“更难的难题”的解决方案是您所追求的,那么您可以首先确定输入的类型,并相应地进行处理:
if ischar(hhh)
%// Apply solution to string array
%//...
else if isnumeric(hhh)
%// Apply solution to numeric input
%// ...
else
%// This type is unsupported
assert('Matrix is of unsupported type')
end
字符串输入
如果您有一个字符串输入,您可以通过测试char
equality:
find(hhh(:, 1) == '1')
对于字符串数组(即char
矩阵),您可以提取find
(行和列)的两个输出,以确定哪个活动位对应于哪个字符串:
[r, c] = find(hhh == '1');
数字输入
对于数字输入,可以使用获取二进制表示形式。因此,它与字符串输入的解决方案非常相似:
B = bsxfun(@bitget, hhh, size(hhh, 1):-1:1);
[r, c] = find(B);
请注意,find
搜索非零元素,因此无需显式编写find(B==1)
组合溶液
如果“更难的难题”的解决方案是您所追求的,那么您可以首先确定输入的类型,并相应地进行处理:
if ischar(hhh)
%// Apply solution to string array
%//...
else if isnumeric(hhh)
%// Apply solution to numeric input
%// ...
else
%// This type is unsupported
assert('Matrix is of unsupported type')
end
以回答的形式重复我的评论: 在这种情况下,不需要使用类似字符串/数组的位表示。 您可以在
find(mlf)
的输出上使用bitget
。比如:
filled = find(mlf);
filled_and_bit2 = filled(logical(bitget(filled,2)));
以回答的形式重复我的评论: 在这种情况下,不需要使用类似字符串/数组的位表示。 您可以在
find(mlf)
的输出上使用bitget
。比如:
filled = find(mlf);
filled_and_bit2 = filled(logical(bitget(filled,2)));
这不是对问题的直接回答,而是相关的——塞巴斯蒂安在评论中的观点很好!因此,假设二进制文件是索引。现在不是玩dec2bin之类的游戏
>> hhh=dec2bin(find(mlf));B=bsxfun(@bitget, hhh, 8:-1:1);find(B)
Error using bsxfun
Non-singleton dimensions of the two input arrays must match each other.
我们可以直接处理如下索引
>> filled = find(mlf);
filled_and_bit2 = bitget(filled,1);
filled(logical(filled_and_bit2))
ans =
1
7
它在其中查找具有第一个活动位的二进制文件
程序
数据
>> mlf=sparse([],[],[],2^31,1);
mlf(1)=7;
mlf(4)=10;
mlf(7)=-1;
>> mlf
mlf =
(1,1) 7
(4,1) 10
(7,1) -1
>> find(mlf)
ans =
1
4
7
将索引数字解释为二进制
(1,1) -----> 000001
(4,1) -----> 000100
(7,1) -----> 000111
示例
输出1:查找第三位处于活动状态的情况
4
7
1
7
4
输出:查找第一位处于活动状态的情况
4
7
1
7
4
输出:查找第二位处于活动状态的情况
4
7
1
7
4
这不是对问题的直接回答,而是相关的——塞巴斯蒂安在评论中的观点很好!因此,假设二进制文件是索引。现在不是玩dec2bin之类的游戏
>> hhh=dec2bin(find(mlf));B=bsxfun(@bitget, hhh, 8:-1:1);find(B)
Error using bsxfun
Non-singleton dimensions of the two input arrays must match each other.
我们可以直接处理如下索引
>> filled = find(mlf);
filled_and_bit2 = bitget(filled,1);
filled(logical(filled_and_bit2))
ans =
1
7
它在其中查找具有第一个活动位的二进制文件
程序
数据
>> mlf=sparse([],[],[],2^31,1);
mlf(1)=7;
mlf(4)=10;
mlf(7)=-1;
>> mlf
mlf =
(1,1) 7
(4,1) 10
(7,1) -1
>> find(mlf)
ans =
1
4
7
将索引数字解释为二进制
(1,1) -----> 000001
(4,1) -----> 000100
(7,1) -----> 000111
示例
输出1:查找第三位处于活动状态的情况
4
7
1
7
4
输出:查找第一位处于活动状态的情况
4
7
1
7
4
输出:查找第二位处于活动状态的情况
4
7
1
7
4
您意识到当您键入
1010100
时,不会得到二进制数,对吗?您得到的是十进制数字“一百万、一万和一百”。您如何存储二进制数组?这看起来就像一个double
数组me@hhh这些不是二进制数,它们是小数。我认为你应该坚持使用字符串:hhh=['1010100';'0010000';'1010000';'0001101']代码>0001101无论如何不能是双
表示。它将被减少到1101。确实很奇怪,bitget
返回双精度,而不是逻辑性的…您意识到当您键入1010100
时,您不会得到二进制数,对吗?您得到的是十进制数字“一百万、一万和一百”。您如何存储二进制数组?这看起来就像一个double
数组me@hhh这些不是二进制数,它们是小数。我认为你应该坚持使用字符串:hhh=['1010100';'0010000';'1010000';'0001101']代码>0001101无论如何不能是双
表示。它将被减少到1101。尽管非常奇怪,bitget
返回双精度,而不是逻辑性的…Thishhhh=['1010100';'0010000';'1010000';'0001101'];find(bin2dec(hhhh)>bin2dec('0010000'))
应该返回123
,而不仅仅是12
,大于比较不是检查一个活动位,即第n位是否为1…@hhh然后使用=
,但是字符串处理版本会更快,因为它们不需要调用bin2dec
,我还无法取消该查找(hhh(:,