Matrix и matrix - в чем отличие?

Форум пользователей пакета Maple

Модератор: Admin

VAngeL1986
Сообщения: 4
Зарегистрирован: Пт дек 15, 2006 2:00 pm

Matrix и matrix - в чем отличие?

Сообщение VAngeL1986 » Вс дек 24, 2006 1:00 pm

Есть простой код:

Код: Выделить всё

restart; Digits:=20;
                             Digits := 20

> c:=1; n:=31;

                                c := 1


                               n := 31

> H:=Matrix(n);

                         [ 31 x 31 Matrix       ]
                    H := [ Data Type: anything  ]
                         [ Storage: rectangular ]
                         [ Order: Fortran_order ]


Генерация матрицы H в зависимости от n
> for i from 1 to n do
  for j from 1 to n do
  if (i<j) then H[i, j]:=c*(j-i) elif (i=j) then H[i, j]:=1/2*c*(n-i+1) else H[i, j]:=c*(n-i+1);
  end if;
  end do;
  end do;

> unassign('i', 'j');

> seq(sum(H[j, i], i=1..n), j=1..n);
Error, bad index into Matrix


но он почему то не работает (последняя строчка) ..."методом тыка" я выяснил, что при замене типа переменной H с Matrix на matrix все прекрасно работает... почему? В чем такое отличие matrix от Matrix?
Заранее спасибо.

xyz
Сообщения: 202
Зарегистрирован: Чт мар 24, 2005 3:42 pm

Сообщение xyz » Вс дек 24, 2006 3:20 pm

Дело в том, что matrix и Matrix используют совершенно различные базовые структуры. Если первая использует стандартную array-функцию Maple (см. пакет linalg), то Matrix использует имплантированную NAG-функцию rtable (см. пакет LinearAlgebra). Говорить о принципиальных различиях обоих структур можно много, однако лучше всего это изложено у проф. В.З. Аладьева в его книгах (см. www.aladjev.newmail.ru, www.aladjev.narod.ru, www.aladjev-maple.narod.ru). Там же представлены и его средства по работе с rtable-структурами и конвертации этих структур в классические Maple-структуры, и наоборот.

Irmantas
Сообщения: 589
Зарегистрирован: Ср апр 27, 2005 8:49 pm
Откуда: Литва, Каунас

Re: Matrix и matrix - в чем отличие?

Сообщение Irmantas » Вс дек 24, 2006 4:30 pm

H; whattype(H); unassign('i', 'j'); seq(add(H[j, i], i=1..n), j=1..n);

i:='i': j:='j': h:=convert(H,matrix):
evalm(h): whattype(evalm(h));
seq(sum(h[j, i], i=1..n), j=1..n);

Matrix - преднозначены для большого размера матриц (rtable типа)
matrix - масивы (array типа)
...Матрицы (matrix) в пакете linalg вычисляются только до уровня своих имен, о этому в нем невазможно вычислить операции поэлементного суммирования или вычитания, используя простые операции над идентификаторами матриц, и приходится пользоватся специальным синтаксисом через команду evalm(). В пакете LinearAlgebra матрицы (Matrix) вычисляются до уравня своих элементов, поэтому простое задание имени матрицы в области ввода рабочего листа приводит к отображению ее элементов, а не имени матрицы ...
("Maple 6, решение задач высшей математики и механики",A.Матосов )

VAngeL1986
Сообщения: 4
Зарегистрирован: Пт дек 15, 2006 2:00 pm

Сообщение VAngeL1986 » Вс дек 24, 2006 7:21 pm

Спасибо вам большое за разъяснения! Теперь все ясно!:)

aar
Сообщения: 100
Зарегистрирован: Чт авг 10, 2006 11:27 am

Сообщение aar » Пн дек 25, 2006 12:19 pm

Если вместо sum в последней строчке использовать add, то ошибки не будет и с типом Matrix. И вообще не надо использовать sum, если границы суммирования известные числа.