Отображение матрицы в двоичном файле в Perl - PullRequest
2 голосов
/ 19 марта 2009

У меня есть 14 МБ файл с матрицей в двоичном формате. Я хотел бы выпить это и иметь что-то вроде массива массивов, чтобы я мог прочитать некоторые значения. Я надеялся найти какой-нибудь волшебный модуль Perl, который, учитывая размер матрицы, сделает всю работу за меня:)

Но я не могу найти это, и я подозреваю, что мне просто не хватает более очевидного способа сделать это. PDL :: IO :: FlexRaw близок к тому, что мне нужно, хотя я немного озадачен предупреждением со странными символами, добавленными F77.

Матрица находится в двоичном файле, в необработанном формате, в 64-разрядных числах с плавающей запятой. Первые восемь байтов двоичного файла - это первая «ячейка» матрицы (1,1). Следующие восемь байтов являются второй ячейкой (2,1). У него нет верхнего и нижнего колонтитула. Я знаю его размеры, поэтому могу сказать модулю «У меня есть строки для каждых 64000 байтов».

Я смотрю на tie :: mmapArray, но я не знаю, смогу ли я заставить его работать. Может быть, мне лучше использовать lseek (), чтобы найти восемь нужных мне байтов, а затем распаковать () его?

Каков наилучший способ сделать это?

Ответы [ 3 ]

1 голос
/ 19 марта 2009

Если у вас недостаточно памяти, просто прочитайте весь файл.

$size = -s $filename;
open(DATA, $filename);
sysread DATA, $buffer, $size;
@floats = unpack("d*", $buffer);
$float2x1 = $floats[ 2 + (1-1)*$width ];

Это должно получить доступ (2,1). (Я не проверял это, хотя ...)

EDIT:

Хорошо, версия с низким объемом памяти:

use Sys::Mmap;
new Sys::Mmap $buffer, -s $filename, $filename or die $!;
$float2x1 = unpack("d", substr($buffer,8*( (2-1) + (1-1)*$width ),8));

Просто нужен Sys :: Mmap из CPAN.

0 голосов
/ 19 марта 2009

Не зная структуры вашего файла, как любая библиотека может надеяться на его чтение? Если это какой-то стандартизированный матричный двоичный формат, то вы можете попробовать поискать CPAN . В противном случае, я полагаю, вам придется делать работу самостоятельно.

Предполагая, что это не разреженная матрица , возможно, это просто вопрос чтения размеров и последующего чтения в блоках соответствующего размера.

0 голосов
/ 19 марта 2009

Взгляд на pack и unpack (особенно unpack) может поставить вас на правильный путь, посмотрите на формат b.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...