Counting

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

Модератор: Admin

hirnyk
Сообщения: 438
Зарегистрирован: Пт апр 08, 2005 1:41 pm

Counting

Сообщение hirnyk » Вт авг 09, 2011 8:50 am

Как сформировать все матрицы размера k × n с элементами из {0,1}?

Selin
Сообщения: 43
Зарегистрирован: Чт апр 14, 2011 11:14 am

Сообщение Selin » Вт авг 09, 2011 1:13 pm

Можно, например, использовать простую процедуру Аладьева allmatrices(M::evaln, m::posint, n::posint, S::{set(string), list(string)}), где М –символ, через который возвращается список всех матриц, m,n – кол-во строк, столбцов и S – алфавит, из которого берутся элементы матриц. Процедура взята из конспекта мастер-класса автора в 2005. Используемая процедура tuples из его же биб-ки и возвращает всевозможные кортежи. Процедура приводилась в процессе изложения, поэтому вполне возможны и другие варианты. Пример в приложении.

Selin
Сообщения: 43
Зарегистрирован: Чт апр 14, 2011 11:14 am

Сообщение Selin » Вт авг 09, 2011 2:15 pm

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

Kitonum
Сообщения: 2079
Зарегистрирован: Ср дек 31, 2008 1:55 pm
Откуда: г. Пенза

Сообщение Kitonum » Вт авг 09, 2011 6:07 pm

Selin писал(а):Учитывая возможность отсутствия необходимой версии биб-ки Аладьева, прилагаю документ, расширенный на процедуру tuples.

Посмотрел, но что-то пока не понял что-такое tuples.
Мне, конечно, сложно соперничать с В.З.Аладьевым, но всё-же приведу свой вариант решения проблемы ( A - множество, из которого берутся элементы матриц, k - число строк, n - число столбцов):

AllMatrices:=proc(A::set,k::posint,n::posint)
local B,C,E:
B:=[[]]:
C:=proc()
B:=[seq(seq([A[i],op(B[j])],i=1..nops(A)),j=1..nops(B))]:
end proc:
E:=(C@@(n*k))(B):
seq(Matrix(k,n,E[m]),m=1..nops(A)^(k*n));
end proc:


Пример работы:

AllMatrices({0,1},2,2);
Изображение

Selin
Сообщения: 43
Зарегистрирован: Чт апр 14, 2011 11:14 am

Сообщение Selin » Вт авг 09, 2011 8:01 pm

Насчет соперничества - это конечно, а вот tuples служит для генерации всех кортежей длины р из элементов некоторого алфавита А. Средство приличное и полезное, текст я привел, в версии 11 его нет. Это аналог функции Tuples для Mathematica - очень полезная при работе с матрицами, массивами, таблицами и т.д.

abobroff
Сообщения: 105
Зарегистрирован: Ср янв 19, 2011 4:40 pm
Откуда: карелия

Сообщение abobroff » Вт авг 09, 2011 8:57 pm

как у Kitonum'a

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

op(Matrix~(combinat[permute]([0,0,0,0,1,1,1,1], 4),2,2))

Kitonum
Сообщения: 2079
Зарегистрирован: Ср дек 31, 2008 1:55 pm
Откуда: г. Пенза

Сообщение Kitonum » Ср авг 10, 2011 7:41 am

To Selin:
Спасибо за разъяснение!

To abobroff:
Ваш подход с помощью штатного средства combinat[permute] оказался наиболее простым, надо будет "принять на вооружение". Спасибо!