Как перевернуть матрицу на 90 градусов ?
Как сделать так, чтобы числа, заданные в квадратной матрице переместились на 90 градусов?
(Сам код я написать могу, мне нужна именно формула, при помощи которой числа будет перемещены на новые места)
Благодарю за отведенное на меня время.
Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Перевернуть матрицу на 90 градусов по часовой стрелке, а затем найти строку, сумма элементов которой наименьшая
Дана матрица размером М на Н,заполненная 0 и 1. Матрицу нужно перевернуть на 90 градусов по часовой.
Перевернуть строки на 90 градусов
Вам заданы несколько строчек текста (сначала количество строчек, потом сами строчки). Вам надо.
Заполнить матрицу случайными числами. Развернуть матрицу на 90(градусов) против часовой стрелки
Заполнить матрицу случайными числами. Развернуть матрицу на 90o против часовой стрелки
Перевернуть матрицу по диагонали
Помогите пожалуйста. Задача: перевернуть матрицу по диагонали
27697 / 17314 / 3811
Регистрация: 24.12.2010
Сообщений: 38,979
D303, Имхо, это реализуется серией циклических сдвигов одномерных массивов. Так, для матрицы четного порядка это
1) циклический сдвиг элементов внутреннего квадрата (их 4) на 1
2) циклический сдвиг элементов объемлющего квадрата 4х4 (12 элементов, сдвиг на 3)
.. и так далее
Для нечетного порядка — аналогично
Сообщение от D303 
мне нужна именно формула
Формулы предложить не могу. Но алгоритмы таких сдвигов одномерных массивов есть. Они не совсем тривиальны, но многократно обсуждались на форуме. Один из изящных алгоритмов носит бандитское название «два кулака». Он не самый оптимальный, но — неплохой.
Если вам понятна идея сведения задачи к серии одномерных циклических сдвигов, будем искать дальше.
Не исключено, что для вашего «квадратного» случая есть и более оптимальные решения.
Заблокирован
вроде можно поворачивать «концентрические» квадраты/их периметры
353 / 134 / 28
Регистрация: 16.12.2012
Сообщений: 607
Записей в блоге: 1
Сообщение от Байт 
Имхо, это реализуется серией циклических сдвигов одномерных массивов
Чего? Циклических сдвигов? Сдвигов? Да еще и циклических?
610 / 415 / 151
Регистрация: 11.01.2019
Сообщений: 1,746

Сообщение было отмечено D303 как решение
Решение
Если матрица A — исходная, а B — результат, то формула будет такой (если верно понял задачу и нигде не накосячил):
817 / 504 / 211
Регистрация: 19.01.2019
Сообщений: 1,196
Зачем нужна формула, когда можно пройтись по матрице в определённом порядке
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
#include #include class Matrix { private: size_t mRows; size_t mCols; std::vectorint> mData; private: bool isValid(size_t i, size_t j) const { return (i >= 0) && (i mRows) && (j >= 0) && (j mCols); } public: ~Matrix() = default; Matrix(size_t rows, size_t cols) : mRows(rows), mCols(cols), mData(rows * cols) {} void fillRand(int low = 0, int up = 9) { for (int i = 0; i mRows; ++i) { for (int j = 0; j mCols; ++j) { mData[i * mCols + j] = (rand() % (up - low + 1)) - low; } } } void show() { for (int i = 0; i mRows; ++i) { for (int j = 0; j mCols; ++j) { std::cout [ i * mCols + j] <" "; } std::cout <'\n'; } std::cout <'\n'; } void rotateCW() { std::vectorint> rotated; for (int i = 0; i mCols; ++i) { for (int j = mRows - 1; j >= 0; --j) { rotated.push_back(mData[j * mCols + i]); } } mData = rotated; std::swap(mRows, mCols); } void rotateCCW() { std::vectorint> rotated; for (int i = mCols - 1; i >= 0; --i) { for (int j = 0; j mRows; ++j) { rotated.push_back(mData[j * mCols + i]); } } mData = rotated; std::swap(mRows, mCols); } }; int main() { Matrix mx(3, 5); mx.fillRand(); mx.show(); mx.rotateCW(); mx.show(); mx.rotateCW(); mx.show(); mx.rotateCW(); mx.show(); mx.rotateCW(); mx.show(); system("pause"); return 0; };
Как транспонировать матрицу
На данной странице калькулятор поможет транспонировать матрицу онлайн с подробным решением. Для расчета задайте целые или десятичные числа.
Транспонировать матрицу
Транспонированная матрица — матрица A T , полученная из исходной матрицы A заменой строк на столбцы.
Пример
$<\left(\begin1 & 2 \\ 3 & 4 \\ 5 & 6 \end\right) =\left(\begin1 & 3 & 5 \\ 2 & 4 & 6 \end\right)>$
Свойства транспонированных матриц
(A T ) T = A
дважды транспонированная матрица А равна исходной матрице А
(A T ) T = A
транспонированная сумма матриц равна сумме транспонированных матриц
(АВ) T = В T А T
транспонированное произведение матриц равно произведению транспонированных матриц, взятых в обратном порядке.
(λА) T = λА T
при транспонировании можно выносить скаляр.
det А = det А T
определитель транспонированной матрицы равен определителю исходной матрицы.
Поворот матрицы на месте на 180 градусов
Учитывая квадратную матрицу, поверните матрицу на 180 градусов по часовой стрелке. Преобразование должно быть сделано на месте в квадратичное время.
Input:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
Output:
16 15 14 13
12 11 10 9
8 7 6 5
4 3 2 1
Если мы поменяем местами элементы первой строки с элементами последней строки в обратном порядке, элементы второй строки с элементами предпоследней строки в обратном порядке и так далее… мы получим искомую матрицу. Обратите внимание, что если матрица имеет нечетные размеры, переверните элементы средней строки.
Алгоритм может быть реализован следующим образом на C++, Java и Python:
Как перевернуть матрицу
БлогNot. С++: поворот матрицы
С++: поворот матрицы
Любопытная задача — не транспонировать, а именно повернуть на 90, 180 или 270 градусов матрицу.
Если результаты перестановки писать в новую матрицу, задач тривиальна. Достаточно иметь функцию вращения матрицы на 90 градусов (например, по часовой стрелке), вызываемую нужное число раз. В примере квадратная матрица «вращается» четырежды, возвращаясь, в итоге, «на место». Для неквадратной матрицы изменятся лишь границы циклов и выделение памяти.
#include int ** turn90 (int n, int **a) < int i,j; int **b; b = new int * [n]; for (i=0; ireturn b; > void out (char *s, int n, int **a) < int i,j; printf ("\n%s",s); for (i=0; i> int main ()
Вывод этой программы:
Before 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 After 1 21 16 11 6 1 22 17 12 7 2 23 18 13 8 3 24 19 14 9 4 25 20 15 10 5 After 2 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 After 3 5 10 15 20 25 4 9 14 19 24 3 8 13 18 23 2 7 12 17 22 1 6 11 16 21 After 4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
Вращение матрицы «на месте» осуществить посложнее, но тоже возможно. В этом случае задача имеет смысл лишь для квадратной матрицы (иначе будет задача 1, с выделением памяти под новую матрицу — ведь часть элементов могут попасть «в никуда»).
Напишем пару функций для вращения матрицы по и против часовой стрелки на 90 градусов:
#include int **turn90_clockwise (int n, int **a) < int i,j,b; for (i=0;ireturn a; > int **turn90_counterclockwise (int n, int **a) < int i,j,b; for (i=0;ireturn a; > void out (char *s, int n, int **a) < int i,j; printf ("\n%s",s); for (i=0; i> int main ()
Вывод этой программы:
Before 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 After turn90_clockwise 21 16 11 6 1 22 17 12 7 2 23 18 13 8 3 24 19 14 9 4 25 20 15 10 5 After turn90_counterclockwise 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
19.11.2013, 23:01 [27571 просмотр]
