Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
0 / 0 / 0
Регистрация: 17.07.2018
Сообщений: 7

Создание единичной матрицы M*N

17.07.2018, 08:31. Показов 4143. Ответов 24

Студворк — интернет-сервис помощи студентам
Нужно создать единичную матрицу размером M*N. При условии,что каждая строка имеет i единиц,а каждый столбец j единиц. Поэтому нужно организовать алгоритм ,который будет производить заполнение. Идей и мыслей что-то совсем не густо. Подскажите с чего начать.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.07.2018, 08:31
Ответы с готовыми решениями:

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

Заполнение Единичной матрицы
int n = 0; cout <<"Введите размер массива"; cin >> n; int **a = new int* ; for (int i = 0; i < n; i++) { ...

Программа по поиску обратной матрицы с помощью присоединенной единичной матрицы
Здравствуйте. У меня написана программа по поиску обратной матрицы с помощью присоединенной единичной матрицы. Программа работает хорошо ,...

24
0 / 0 / 0
Регистрация: 17.07.2018
Сообщений: 7
18.07.2018, 10:20  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от AlexVRud Посмотреть сообщение
std::gcd
Не подскажите ,что данная строчка делает?Немного почитав,я понял ,что это НОД. Просто VS ругается и поэтому немного непонятно

Добавлено через 20 минут
Кстати,совсем забыл. Матрица должна генерироваться по разному(рандомно).
0
694 / 304 / 99
Регистрация: 04.07.2014
Сообщений: 851
18.07.2018, 15:15
Цитата Сообщение от valek_neznashka Посмотреть сообщение
Не подскажите ,что данная строчка делает?Немного почитав,я понял ,что это НОД. Просто VS ругается и поэтому немного непонятно
Всё верно. Если студия ругается, то либо берёшь более свежую, либо реализуй НОД самостоятельно.
0
0 / 0 / 0
Регистрация: 17.07.2018
Сообщений: 7
13.09.2018, 17:44  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
if( (x+y)%l < n )m[x][y]=1;else m[x][y]=0;
Подскажите пожалуйста,по какому принципу работает проверка? или на какую формулу опирается
0
 Аватар для COKPOWEHEU
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,101
14.09.2018, 10:16
Прошу прощения что поздно ответил. Никак не мог внятно сформулировать как же эта штука работает. То есть понимать-то понимаю, но наукообразно объяснить не могу. Надеюсь, сейчас получилось.
.
Разделим матрицу на одинаковые квадраты размером lxl. По горизонтали их количество составит m=M/l, а по вертикали n=N/l. Такой квадрат можно заполнить таким образом, чтобы количество единиц в каждой строке равнялось количеству в каждом столбце. При этом само количество единиц (u) может быть любым от 0 до l.
На примере l=4:
u=0 и u=4 слишком тривиально
u=1
Code
1
2
3
4
1000
0100
0010
0001
u=2
Code
1
2
3
4
1100
0110
0011
1001
u=3
Code
1
2
3
4
1110
0111
1011
1101
Поскольку по горизонтали таких квадратов m штук, количество единиц в строке равно i=u*m. Аналогично количество единиц в столбце равно j=u*n.
Поскольку размер квадрата d должен быть кратен как размеру строки, так и столбца, он должен являться их делителем. Лучше всего - наибольшим общим делителем, НОД. То есть l = НОД(M, N).
Проверим по формуле Байта:
Code
1
2
j*M = i*N
(u*n)*(l*m) = (u*m)*(l*n)
Все сходится
Теперь вычислим u (в коде оно неудачно обозначено буквой n):
Code
1
2
i=u*m
u = i/m = i/(M/l) = l*i/M

Не по теме:

Похоже, в коде перепутаны i и j, а может это как-то следует из условия, уже не помню


Итак, если у нас есть квадрат размера l, в каждой строке и в каждом столбце которого u единиц, мы можем размножить его m раз по горизонтали и n раз по вертикали и получим желаемую матрицу.
Теперь о заполнении собственно квадрата.
Заполнять будем по строкам. Длина каждой строки l, в ней ровно u единиц. Пусть сначала идут единицы, потом оставшиеся нули. Например, если l=5, u=2, строка будет выглядеть как 11000. В коде это запишется как
C
1
2
for(x=0; x<l; x++)
  if(x < u)arr[x]=1; else arr[x]=0;
Теперь заполним остальные. Проще всего циклически сдвигать каждую следующую строчку. Например, если 1 строчка равна 12345, то вторая может быть
23451 (<--) или 51234 (-->)
третья
34512 (<--) или 45123 (-->)
и т.д.
Я выбрал сдвиг влево, потому что он проще в коде. Достаточно к горизонтальной координате прибавить вертикальную:
C
1
if( (x+y) < u )arr[x][y]=1; else arr[x][y]=0;
Возникает проблема если эта сумма выйдет за пределы стороны квадрата. Кроме того, заполнять матрицу по отдельным квадратам неудобно. Придется делать 4 вложенных цикла. Вместо этого воспользуемся остатком от деления, чтобы шаблон автоматически повторялся на любом расстоянии от начала:
C
1
if( (x+y)%l < u )arr[x][y]=1; else arr[x][y]=0;
Добавлено через 9 минут
Теперь можно проанализировать диапазоны значений.
Code
1
2
j*M = i*N
(u*n)*(l*m) = (u*m)*(l*n)
Здесь мы видим, что числа m и n взаимно простые и однозначно вычисляющиеся из размеров матрицы. Отсюда можно найти диапазоны значений i, j:
Code
1
2
3
i = u*m
j = u*n
u = [0...l]
Таким образом, чтобы получить какую-нибудь красивую картинку (для тестов и прочего) сначала выбираем любое число в качестве НОД. Чем оно больше, тем больше вариантов заполнения. Скажем, для l=1 вариантов всего два: 0 и 1. Потом выбираем не слишком большие взаимно простые числа m и n, умножаем их на НОД и передаем программе как M, N. Теперь выбираем какое-нибудь число в диапазоне от 0 до НОД, оно будет коэффициентом заполнения. Умножаем его на m и n и тоже передаем программе как i, j.
Наслаждаемся красотой двоичных рисунков!
0
techpriest
 Аватар для Mirmik
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
14.09.2018, 17:39
del
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.09.2018, 17:39

Реализовать разложение на произведение ортогональной матрицы и нижней треугольной матрицы с единичной диагональю
Доброго времени суток! Подскажите или помогите, пожалуйста, как реализовать разложение на произведение ОРТОГОНАЛЬНОЙ МАТРИЦЫ и НИЖНЕЙ...

StringGrid и поиск единичной матрицы
Подскажите как сделать функцию поиска единичной матрицы, количество элементов в StringGrid заведомо не известно. И если такой матрицы не...

Алгоритм проверки единичной матрицы
Не могу никак додумать алгоритм. Извиняюсь заранее, в Delphi новичок также как и на этом форуме) Очень нужна помощь Ваша) procedure...

Заменить строки матрицы, содержащие максимальный элемент, на соответствующие строки единичной матрицы
В заданной двумерной матрице замените строки, содержащие максимальный элемент, на соответствующие строки единичной матрицы.

Найти вектор единичной длины
Здравствуйте, нужна помощь в решении задачи по линейной геометрии. Решить ее нужно используя только тему прямая в пространстве,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru