Заполнениие матриц заданными числами

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

Модератор: Admin

Vlada
Сообщения: 24
Зарегистрирован: Пт дек 09, 2011 9:15 pm

Заполнениие матриц заданными числами

Сообщение Vlada » Пт дек 09, 2011 9:27 pm

Здравствуйте.

Помогите, пожалуйста, разобраться в следующей задаче.

Задан размер матрицы. Нужно создать множество всех матриц, каждый элемент которых принимает или 0, или 1. Описать данное множество в виде массива.

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

Re: Заполнениие матриц заданными числами

Сообщение Kitonum » Пт дек 09, 2011 9:49 pm

Vlada писал(а):Здравствуйте.

Помогите, пожалуйста, разобраться в следующей задаче.

Задан размер матрицы. Нужно создать множество всех матриц, каждый элемент которых принимает или 0, или 1. Описать данное множество в виде массива.

Почитайте эту тему
http://forum.exponenta.ru/viewtopic.php?t=11332&highlight=

Vlada
Сообщения: 24
Зарегистрирован: Пт дек 09, 2011 9:15 pm

Сообщение Vlada » Пт дек 09, 2011 9:55 pm

Спасибо.

Vlada
Сообщения: 24
Зарегистрирован: Пт дек 09, 2011 9:15 pm

Сообщение Vlada » Пт дек 09, 2011 10:35 pm

Возник еще вопрос. Приводимые примеры, в данной ссылке, работают для матриц небольших размеров, но для матрицы 3 на 5 уже результаты не выводятся. [Length of output exceeds limit of 1000000]
Как записать результаты в одномерный массив, чтобы вывод был не всех матриц, а конкретной по индексу в массиве, для дальнейшего преобразования нужных матриц.

Vlada
Сообщения: 24
Зарегистрирован: Пт дек 09, 2011 9:15 pm

Сообщение Vlada » Пт дек 09, 2011 10:45 pm

Подскажите, пожалуйста, также как разобраться в том, чтобы одним элементам матрицы присваивать значения из одного множества, а другим - из другого. Например, угловые или диагональные элементы оставить постоянными, равными заранее заданному числу.

Markiyan Hirnyk
Сообщения: 1340
Зарегистрирован: Вс дек 04, 2011 11:07 pm

Сообщение Markiyan Hirnyk » Пт дек 09, 2011 11:07 pm

Vlada писал(а):Подскажите, пожалуйста, также как разобраться в том, чтобы одним элементам матрицы присваивать значения из одного множества, а другим - из другого. Например, угловые или диагональные элементы оставить постоянными, равными заранее заданному числу.
Это другой вопрос, который следует задавать отдельно. Старайтесь формулировать вопрос предельно четко. Например, матрица какого размера и какая ее диагональ имеются в виду?

Markiyan Hirnyk
Сообщения: 1340
Зарегистрирован: Вс дек 04, 2011 11:07 pm

Сообщение Markiyan Hirnyk » Пт дек 09, 2011 11:17 pm

Vlada писал(а):Возник еще вопрос. Приводимые примеры, в данной ссылке, работают для матриц небольших размеров, но для матрицы 3 на 5 уже результаты не выводятся. [Length of output exceeds limit of 1000000]
Как записать результаты в одномерный массив, чтобы вывод был не всех матриц, а конкретной по индексу в массиве, для дальнейшего преобразования нужных матриц.

> restart;
> 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)^(n*k))
end proc;
> L := [AllMatrices({0, 1}, 3, 5)];

[Length of output exceeds limit of 1000000]
L[2367]
Matrix(3, 5, {(1, 1) = 0, (1, 2) = 1, (1, 3) = 1, (1, 4) = 1, (1, 5) = 1, (2, 1) = 1, (2, 2) = 0, (2, 3) = 0, (2, 4) = 1, (2, 5) = 0, (3, 1) = 0, (3, 2) = 1, (3, 3) = 0, (3, 4) = 0, (3, 5) = 0})

Vlada
Сообщения: 24
Зарегистрирован: Пт дек 09, 2011 9:15 pm

Сообщение Vlada » Пт дек 09, 2011 11:19 pm

Задача ставится для матриц размера k × n, где k и n могут принимать значения от 3 до 7. Входными данными являются задания n и k, а также элементов матриц, которые не изменяются. Как подзадача, не изменяются угловые клетки (1,1), (1,n), (k,1), (k,n). Для полученного набора матриц нужно выполнить операции, например, сложение матриц, у которых последний столбец состоит из 1, поэтому нужен вектор или массив полученных матриц, для сравнения в цикле и последующего сложения.
Спасибо за помощь. Извините за нечеткие формулировки. Учусь.

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

Сообщение Kitonum » Пт дек 09, 2011 11:28 pm

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

Подсказка: внесите минимальные изменения в предпоследнюю строку моей процедуры.

Vlada
Сообщения: 24
Зарегистрирован: Пт дек 09, 2011 9:15 pm

Сообщение Vlada » Пт дек 09, 2011 11:41 pm

Спасибо. Подскажите, пожалуйста, что означают следующие команды:
B := [[]];
C@@(n*k);

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

Сообщение Kitonum » Сб дек 10, 2011 12:34 am

Vlada писал(а):Спасибо. Подскажите, пожалуйста, что означают следующие команды:
B := [[]];
C@@(n*k);

[] - пустой список, @@ - оператор повторяющейся композиции.

Vlada
Сообщения: 24
Зарегистрирован: Пт дек 09, 2011 9:15 pm

Сообщение Vlada » Пт дек 23, 2011 10:04 pm

Спасибо за предыдущие подсказки. Помогите, пожалуйста, решить еще такую проблему. Указанный метод не работает для матрицы 5 на 8. Что можно сделать. Спасибо.

Vlada
Сообщения: 24
Зарегистрирован: Пт дек 09, 2011 9:15 pm

Сообщение Vlada » Пт дек 23, 2011 10:10 pm

И еще вопросик. Как заполнить матрицы не просто числами из определенного множества, а еще и указать, сколько каких должно быть, например: заполнить матрицу числами 0 или 1, чтобы в каждой было ровно одна 2. В этом примере, можно посторить матрицы, как и раньше, а потом с помощью цикла все по очереди перебирать и изменять одну из позиций на 2. Но если задать условие, что в каждой матрице должно быть, например, две 2, три 3, а остальные ячейки или 0, или 1, то уже с циклами не очень удобно. Подскажите, пожалуйста.

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

Сообщение Kitonum » Сб дек 24, 2011 2:02 pm

Vlada писал(а):... Указанный метод не работает для матрицы 5 на 8...

На самом деле он работает, но число объектов черезчур велико, оперативной памяти не хватает. Легко подсчитать, что число всевозможных матриц размера 5 на 8 с элементами из множества {0,1} равно 2^40 штук, что превышает 1 триллион!

Vlada писал(а):... Как заполнить матрицы не просто числами из определенного множества, а еще и указать, сколько каких должно быть, например: заполнить матрицу числами 0 или 1, чтобы в каждой было ровно одна 2. В этом примере, можно посторить матрицы, как и раньше, а потом с помощью цикла все по очереди перебирать и изменять одну из позиций на 2. Но если задать условие, что в каждой матрице должно быть, например, две 2, три 3, а остальные ячейки или 0, или 1, то уже с циклами не очень удобно...


Для решения указанных задач старая процедура не подходит! Написал новую процедуру, использующую средства подключаемого пакета combinat. Формальные аргументы: М - список списков тех объектов, число которых фиксировано (в каждом подсписке на первом месте сам объект, на втором - сколько раз этот объект повторяется), S - множество объектов, которыми заполняются оставшиеся места в любых комбинациях, m - число строк, n - число стобцов.

Код процедуры:

Proc:=proc(M,S,m,n)
local p,P,P1,i;
p:=m*n-add(M[i,2],i=1..nops(M));
P:=combinat[composition](p+nops(S),nops(S));
P1:=[];
for i from 1 to nops(P) do
P1:=[op(P1), [seq(P[i,k]-1,k=1..nops(S))]];
od;
[seq(op(combinat[permute]([seq(M[i,1]$M[i,2],i=1..nops(M)),seq(S[i]$P1[k,i],i=1..nops(S))])),k=1..nops(P1))];
seq(Matrix(m,n,%[i]),i=1..nops(%));
end proc;


Пример работы (всевозможные матрицы размера 2 на 3, у каждой из которых по две двойки, по одной тройке, остальные 0 и 1):

Proc([[2,2],[3,1]],{0,1},2,3);

Фрагмент вывода (всего таких матриц 480):

Изображение

Vlada
Сообщения: 24
Зарегистрирован: Пт дек 09, 2011 9:15 pm

Сообщение Vlada » Вс дек 25, 2011 8:24 pm

Спасибо большое за данную процедуру. Помогите, пожалуйста, еще с такой задачей. Нужно построить множество всех матриц, массив состоящий из матриц: размер матриц 5 на 8, у которых среди ячеек первой, последней строки и первого, последнего столбца выбраны 2 ячейки, которые заполняются числами из определенного множества, например, числами 0, 1, 2, 3, 4, остальные не изменяются, например, во всех матрицах на этих местах стоит значение "5", получающаяся внутренняя матрица 3 на 6 заполняется, так как вы написали в процедуре. Чтобы легко было в массиве найти нужную матрицу, нужно заиндексировать массив (елси так правильно сказать) числами следующим образом, каждой матрице соответствует число, записанное три строчки вподряд, например матрица
10
23
перепишется в число 1023, таким образом в массиве матриц, L[1023]=данной матрице.
Спасибо большое за помощь.