【问题标题】:Matlab: how to read binary numbers from a file?Matlab:如何从文件中读取二进制数?
【发布时间】:2013-09-09 06:04:37
【问题描述】:

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

$ 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

目标

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

【问题讨论】:

    标签: file matlab math binary string-formatting


    【解决方案1】:

    读取为字符串,然后使用bin2dec 转换为十进制数:

    bin2dec(textread('bin_MCS.txt','%s'))
    
    ans =
    
        25166848
        37749760
       402653184
       335544320
       671088640
       603979776
       553649152
       100664320
       167773184
       285213696
    

    编辑:

    要将单个二进制数字读入矩阵,您可以使用这个(48 是 '0' 的 ASCII 码):

    cell2mat(textread('bin_MCS.txt','%s'))-48
    

    【讨论】:

    • 我的回答来得太晚了,但bin2dec function 的链接应该会有所帮助。
    • 你应该已经解释了你想用二进制数做什么......也许你可以直接在(二进制)字符串上做
    • @hhh 查看我的编辑。为了清楚起见,也许您还应该更新您的问题
    • 罗杰已更新。谢谢你。你能解释一下cell2mat吗?另一个答案使用与 char 相同的逻辑。
    • @hhh: char 特定于单元格字符串,cell2mat 更通用;它将 any 可转换单元格转换为矩阵(但在这种情况下速度较慢)。
    【解决方案2】:

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

    >> (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.
    

    当然,这不是一个完全公平的测试,但至少它说明存在很大差异。

    【讨论】:

    • 我能理解这么远(char(textread('bin_MCS.txt','%s')))-'0') 很好地分解了这件事,为什么?
    • @hhh:减去'0'基本上等于减去48,即'0'的ASCII码。减法将导致在所有正确位置包含零和一的数组(而不是过去的4849);基本上,这是一种从字符串到数字的丑陋但非常有效的转换。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多