LINUX.ORG.RU

Maxima: матрицы VS массивы


0

0

1) В чем принципиальная разница массивов и матриц в Максиме? Записываются они одиннаково, на сколько я понял..

2) Как можно создать матрицу внутри функции, где -- размер матрицы - это параметр функции -- а ячейки задавать циклом по n,m?

(%i28) func(n,m):=for i:1 thru n do for j:1 thru m do A[i,j]:i+j$

(%i29) A; (%o29) A (%i30) A[1,2]; (%o30) 3

Что такое A в данном случае - матрица или массив? Почему по A не выводится вся матрица?

anonymous

Форматирование, сорри...

1) В чем принципиальная разница массивов и матриц в Максиме? Записываются они одиннаково, на сколько я понял..

2) Как можно создать матрицу внутри функции, где -- размер матрицы - это параметр функции -- а ячейки задавать циклом по n,m?

(%i28) func(n,m):=for i:1 thru n do for j:1 thru m do A[i,j]:i+j$

(%i29) A;
(%o29)                                 A
(%i30) A[1,2];
(%o30)                                 3

Что такое A в данном случае - матрица или массив? Почему по A не выводится вся матрица?

anonymous
()
Ответ на: комментарий от anonymous

`A` — не матрица и не массив вообще, символ `A` даже не был определён. В циклах были определены лишь символы с именами вида `A[<i, j>]`. Максима и не знает, что ты хотел `A` сделать матрицей.

Sphinx ★★☆☆
()
Ответ на: комментарий от Sphinx

Да, Лямбда - это круто:)

А все-таки можно так: в цикле подсчитал значение и всунул его в матрицу в нужное место? Дело в том, что у меня не простая зависимость от i,j, а "накопительная" (т.е. от цикла никуда не деться).

anonymous
()
Ответ на: комментарий от anonymous

тьфу, че-то не то спорол...

Другой пример:

Реализовать обычное умножение матриц. (Я знаю про "точку", это для примера).

anonymous
()
Ответ на: комментарий от anonymous

(%i1) multmatrix(A, B) := block([B: transpose(B)], genmatrix(lambda([i, j], apply("+", map("*", A[i], B[j]))), length(A), length(B)));
(%o1) multmatrix(A, B) := block([B : transpose(B)], 
 genmatrix(lambda([i, j], apply("+", map("*", A , B ))), length(A), length(B)))
                                               i   j
(%i2) (%i2) M: matrix([1, 2], [3, 4], [5, 6], [7, 8]);
                                   [ 1  2 ]
                                   [      ]
                                   [ 3  4 ]
(%o2)                              [      ]
                                   [ 5  6 ]
                                   [      ]
                                   [ 7  8 ]
(%i3) N: matrix([-2, 4, 5, 9], [10, 12, 13.2, -14]);
                            [ - 2  4    5     9   ]
(%o3)                       [                     ]
                            [ 10   12  13.2  - 14 ]
(%i4) M.N;
                           [ 18  28   31.4   - 19 ]
                           [                      ]
                           [ 34  60   67.8   - 29 ]
(%o4)                      [                      ]
                           [ 50  92   104.2  - 39 ]
                           [                      ]
                           [ 66  124  140.6  - 49 ]
(%i5) multmatrix(M, N);
                           [ 18  28   31.4   - 19 ]
                           [                      ]
                           [ 34  60   67.8   - 29 ]
(%o5)                      [                      ]
                           [ 50  92   104.2  - 39 ]
                           [                      ]
                           [ 66  124  140.6  - 49 ]

Sphinx ★★☆☆
()
Ответ на: комментарий от Sphinx

Я, конечно, дико извиняюсь, но не мог-бы русским языком объяснить, что они конкретно делают. А то с полчаса уже смотрю и описание и примеры - въехать не могу.

anonymous
()
Ответ на: комментарий от anonymous

`map()` применяет свой первый аргумент к остальным поэлементно. Например, `map("*", [1, 2, 3], [4, 5, 6])` — это то же самое, что и `[1*4, 2*5, 3*6]`. Рассматривай `"*"` как обозначение для функции умножения.

`apply()` просто применяет свой первый аргумент к значениям, перечисленных списком во втором аргументе. Например, `apply("+", [1, 2, 3])` — то же самое, что и `1+2+3`.

`lambda([i, j], <body>)` *возвращает* функцию двух аргументов `i, j`.

Можно видеть, что вышеприведённое определение `multmatrix` почти точно выражает математическое определение операции перемножения матриц в терминах Maxima без всяких ипацких циклов:

A×B ≝ (∑a_{ik}·b_{kj})

В `multmatrix` покомпонентное умножение выражено в `map("*", …`, а сложение ∑ — при помощи `apply("+", …`

Sphinx ★★☆☆
()
Ответ на: комментарий от Sphinx

да, спасибо, Sphinx!

На самом деле моей ошибкой было то, что объект Матрица я не генерировал...:

for i thru 4 do for j thru 4 do A[i,j]: i+j$
genmatrix(A,4,4);

Т.е. вбил значения элементов A[i,j], но без genmatrix'а :)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.