Как я могу передать разреженный матикс из Perl в R? - PullRequest
3 голосов
/ 04 ноября 2010

У меня очень разреженная матрица Perl (массив массивов), где undef значения эквивалентны нулям. Он имеет 10-1000 строк и до 100 тыс. Столбцов. Похоже:

$ARRAY1 = [
            [
              ( undef ) x 1069,
              1,
              ( undef ) x 47,
              1,
              ( undef ) x 11,
              2,
              ( undef ) x 50,
              1,
              ( undef ) x 23,
              1,
              ( undef ) x 6033,
              ...
            ],
            [
              ...
            ],
            ...
          ]

... как я сказал - очень редкий.

Я хочу использовать эту матрицу в сценарии R (см. предыдущий пост ). Одним из способов является печать таблицы в файл из Perl - одна строка на строку и печать 0 каждый раз, когда мы сталкиваемся с undef.

Но, возможно, есть лучший, более компактный способ пройти эту разреженную матрицу?

Ответы [ 2 ]

3 голосов
/ 04 ноября 2010

Это довольно сложная проблема.

Я думаю, я бы начал с , делая простые вещи возможными , чтобы перефразировать лозунг Perl:

  1. Узнайте о двух или трех разреженных матричных пакетах для R, таких как slam, SparseM, ....
  2. Выберите тот, который вы предпочитаете, и узнайте, как эффективно построить разреженную матрицу, предположительно из триплетов, таких как (x,y,value), для кодирования value в позиции (x,y).
  3. Напишите Perl-код для отправки вашей разреженной матрицы в этой форме в временный файл.
  4. Прочитайте этот временный файл в R и создайте свою разреженную матрицу.

Более изящная и быстрая кросс-языковая сериализация может появиться позже. Это не тривиальная проблема.

0 голосов
/ 04 ноября 2010

Если вы печатаете эти нули в файл, это много ненужной печати для perl и чтения и анализа для R. Более распространенный способ сериализации разреженной матрицы, такой как это, состоит в том, чтобы предоставить только размеры (при необходимости) и ненулевые элементы индексы и значения.Таким образом, ваши промежуточные сериализованные данные могут выглядеть следующим образом:

80000 200
1069 0 1
1117 0 1
1129 0 2
...
...