2013-09-05 4 views
1

Файл имеет двоичные числа, разделенные символом новой строки.Matlab: как читать двоичные числа из файла?

$ 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]. Первая головоломка состоит в том, чтобы читать двоичные числа. Затем следующая головоломка должна быть в состоянии прочитать их в определенном формате.

ответ

3

немного запутанная, но любимый мой:

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

Конечно, это не совсем справедливо тест, но в по крайней мере, это иллюстрирует существенную разницу.

+0

Я могу понять это далеко. (Char (textread ('bin_MCS.txt', '% s'))) 'but' -'0 ') 'отлично разбирается в этой вещи, почему? – hhh

+1

@hhh: вычитание '' 0'' в основном равно вычитанию 48, ASCII-код для ''0''. Вычитание приведет к массиву, содержащему нули и единицы во всех правильных местах (вместо '48' и' 49' это было раньше); в основном, это уродливое, но очень эффективное преобразование из строк в числа. –

4

читаться как струны затем преобразовать в десятичные числа с bin2dec:

bin2dec(textread('bin_MCS.txt','%s')) 

ans = 

    25166848 
    37749760 
    402653184 
    335544320 
    671088640 
    603979776 
    553649152 
    100664320 
    167773184 
    285213696 

EDIT:

Для чтения отдельных двоичных цифр в матрицу, вы можете использовать это (48 является ASCII код '0'):

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

Мой ответ пришел слишком поздно, но ссылка на функцию [bin2dec] (http://www.mathworks.com/help/matlab/ref/bin2dec.html) должна быть полезна. – ford

+0

Вы должны были объяснить, что вы хотите делать с двоичными числами ... Возможно, вы можете сделать это непосредственно на (двоичных) строках –

+0

@Ford. Ты прав. Готово! –

Смежные вопросы