Максима: конвертировать матрицу в список - PullRequest
9 голосов
/ 31 декабря 2011

Я конвертирую список в матрицу в Maxima следующим образом:

DataL : [ [1,2], [2,4], [3,6], [4,8] ];
DataM: apply('matrix,DataL);

Как это сделать по-другому? Как преобразовать данную матрицу DataM в список DataL ?

Ответы [ 2 ]

14 голосов
/ 26 сентября 2012

Я знаю, что уже поздно в игре, но за все, что стоит, есть более простой способ.

my_matrix : matrix ([a, b, c], [d, e, f]);
my_list : args (my_matrix);
 => [[a, b, c], [d, e, f]]
6 голосов
/ 08 января 2012

Я далеко не эксперт по Maxima, но с вы попросили меня взглянуть на этот вопрос , вот что я получил после быстрого просмотра документации .

Во-первых, при просмотре документации по матрицам был получен только один способ превращения матриц в списки - list_matrix_entries. Тем не менее, это возвращает плоский список записей. Чтобы получить структуру вложенного списка, работает что-то вроде следующего

DataL : [[1, 2], [2, 4], [3, 6], [4, 8]];  /* Using your example list */
DataM : apply('matrix, DataL);              /* and matrix             */

DataML : makelist(list_matrix_entries(row(DataM, i)), i, 1, 4);
is(DataML = DataL);   /*  true  */

Это неуклюже и, вероятно, неэффективно. Используя базовую структуру Lisp в Maxima (и аналогию с Mathematica, с которой я более знаком), вы можете исследовать головки DataL и DataM, используя part :

part(DataL, 0);  /*  [       */
part(DataM, 0);  /*  matrix  */

Затем для преобразования между двумя структурами вы можете использовать substpart

is(substpart(matrix, DataL, 0) = DataM);   /*  true  */
is(substpart( "[",   DataM, 0) = DataL);   /*  true  */

Использование substpart на уровне 0 практически аналогично использованию apply, за исключением того, что оно работает не только со списками.

...