File Matlab:如何从文件中读取二进制数?

File Matlab:如何从文件中读取二进制数?,file,matlab,math,binary,string-formatting,File,Matlab,Math,Binary,String Formatting,文件包含以换行符分隔的二进制数。 $ cat bin_MCS.txt |tail 000000001100000000000010000000000 000000010010000000000010000000000 000011000000000000000000000000000 000010100000000000000000000000000 000101000000000000000000000000000 000100100000000000000000000000000 00010

文件包含以换行符分隔的二进制数。

$ cat bin_MCS.txt |tail
000000001100000000000010000000000
000000010010000000000010000000000
000011000000000000000000000000000
000010100000000000000000000000000
000101000000000000000000000000000
000100100000000000000000000000000
000100001000000000000010000000000
000000110000000000000010000000000
000001010000000000000010000000000
000010001000000000000010000000000
Matlab读取DEC中的二进制数,错误

>> textread('bin_MCS.txt')

ans =

   1.0e+30 *

    0.0000
    0.0000
    0.0000
    0.0000
    0.0000
    0.0000
    0.0000
    0.0000
    0.0000
    0.0000
    0.0000
    0.0000
    0.0000
目标

我需要将二进制数读入这样的矩阵[10 1;0 1 1]。第一个难题是能够读取二进制数。接下来的难题是能够以某种格式阅读它们


读取为字符串,然后使用以下命令转换为十进制数:

编辑:

要将单个二进制数字读入矩阵,可以使用以下命令(48是“0”的ASCII码):


有点复杂,但我个人最喜欢:

>> (char(textread('bin_MCS.txt','%s'))-'0') * pow2(32:-1:0).'
ans =
    25166848
    37749760
   402653184
   335544320
   671088640
   603979776
   553649152
   100664320
   167773184
   285213696
如果使用
textscan
,它甚至比
bin2dec
版本更快:

tic
for ii = 1:1e3

    fid = fopen('bin_MCS.txt', 'r');
        C = textscan(fid,'%s');
    fclose(fid);

    R = (char(C{1})-'0') * pow2(32:-1:0).';

end
toc


tic
for ii = 1:1e3
    bin2dec(textread('bin_MCS.txt','%s'));
end
toc
结果:

Elapsed time is 0.182339 seconds.
Elapsed time is 15.600509 seconds.

诚然,这不是一个完全公平的测试,但至少它说明了存在着实质性的差异

我的回答来得太晚了,但是链接到应该是有帮助的。你应该解释一下你想用二进制数做什么。。。也许您可以直接在(二进制)上执行此操作strings@hhh请参阅我的编辑。也许你也应该更新你的问题,让clarityRoger更新。非常感谢。你能解释一下手机号码吗?另一个答案使用与char相同的逻辑。@hhh:
char
特定于单元格字符串,
cell2mat
更通用;它会将任何可转换的单元格转换成矩阵(但在这种情况下速度较慢)。我能理解这一点。
(char(textread('bin_MCS.txt','%s'))
但是
-'0')
很好地分解了这个东西,为什么?@hhh:subtraction
'0'
基本上等于减法48,ASCII码表示
'0'
。减法将生成一个数组,数组中所有正确的位置都包含0和1(而不是以前的
48
49
);基本上,这是一个丑陋但非常有效的从字符串到数字的转换。
tic
for ii = 1:1e3

    fid = fopen('bin_MCS.txt', 'r');
        C = textscan(fid,'%s');
    fclose(fid);

    R = (char(C{1})-'0') * pow2(32:-1:0).';

end
toc


tic
for ii = 1:1e3
    bin2dec(textread('bin_MCS.txt','%s'));
end
toc
Elapsed time is 0.182339 seconds.
Elapsed time is 15.600509 seconds.