Вообще-то никто не запрещает засунуть хоть в вектор хоть в матрицу любой представимый объект, например:
Код:
? m=matrix(3,4,a,b,Set(vector(a+b,i,a*(b+i))))
%1 =
[ [2, 3] [3, 4, 5] [4, 5, 6, 7] [5, 6, 7, 8, 9]]
[ [4, 6, 8] [6, 8, 10, 12] [8, 10, 12, 14, 16] [10, 12, 14, 16, 18, 20]]
[[6, 9, 12, 15] [9, 12, 15, 18, 21] [12, 15, 18, 21, 24, 27] [15, 18, 21, 24, 27, 30, 33]]
Но вот операций чтобы влезали внутрь элементов вектора или матрицы вроде бы нет, их придётся организовывать самому в виде циклов обхода вектора/матрицы (конечно удобнее убрать в функции). Насколько при этом PARI будет удобнее или неудобнее других языков так сразу сказать трудно, так и так делать циклы обхода внешней структуры. Но один минус виден сразу: нет перегрузки операций и нельзя будет записать
даже если определите функцию суммирования своих объектов, только в виде
и не иначе. Так себе минус, скорее минусик, всё равно большинство операций не стандартны и нет готовых операций для перегрузки (правда если напишите свои, то и их перегрузить не сможете, нет самого механизма перегрузки).
Существеннее минус что нельзя создавать "типизированные" функции (с одним именем но разными типами аргументов и срабатывает та функция под которую походят аргументы в конкретном вызове). Это конечно решается проверкой аргументов в самой функции и либо приведением их, либо кучей if-ов для разных вариантов аргументов, но это не столь удобно.
В общем хорошо развитый язык с произвольными классами (или ООП) думаю был бы удобнее.