Как повернуть матрицу на 90 градусов c
Перейти к содержимому

Как повернуть матрицу на 90 градусов c

  • автор:

Поворот матрицы на 90 градусов против часовой стрелки

Уточните пожалуйста — у вас матрица это список списков, Numpy 2D array, Pandas DataFrame или что-то другое?

18 мар 2018 в 19:12
Простая, список списков
18 мар 2018 в 19:18

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

проще всего будет воспользоваться Numpy:

import numpy as np In [86]: l Out[86]: [[0, 0, 0, 0], [0, 0, 0, 1], [0, 0, 0, 1], [0, 0, 0, 1]] In [87]: a = np.array(l) In [70]: a Out[70]: array([[0, 0, 0, 0], [0, 0, 0, 1], [0, 0, 0, 1], [0, 0, 0, 1]], dtype=int64) 
In [71]: np.rot90(a) Out[71]: array([[0, 1, 1, 1], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], dtype=int64) 

можно несколько раз повернуть:

In [72]: np.rot90(a, k=2) Out[72]: array([[1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0], [0, 0, 0, 0]], dtype=int64) 

«вернуть» к обычному списку списков:

In [107]: np.rot90(a).tolist() Out[107]: [[0, 1, 1, 1], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] 

без использования Numpy:

In [131]: list(zip(*lst))[::-1] Out[131]: [(0, 1, 1, 1), (0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)] 
In [140]: a Out[140]: array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [12, 13, 14, 15]]) In [141]: lst = a.tolist() In [142]: lst Out[142]: [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15]] In [143]: np.rot90(a) Out[143]: array([[ 3, 7, 11, 15], [ 2, 6, 10, 14], [ 1, 5, 9, 13], [ 0, 4, 8, 12]]) In [144]: np.rot90(a).tolist() Out[144]: [[3, 7, 11, 15], [2, 6, 10, 14], [1, 5, 9, 13], [0, 4, 8, 12]] In [145]: list(zip(*lst))[::-1] Out[145]: [(3, 7, 11, 15), (2, 6, 10, 14), (1, 5, 9, 13), (0, 4, 8, 12)] 

Повернуть квадратную матрицу на 90 градусов по часовой стрелке — C (СИ)

В данном коде на языке C происходит поворот квадратной матрицы на 90 градусов по часовой стрелке.

  1. Объявляется матрица matrix размером n на n и заполняется нулями и единицами.
  2. Выводится на экран исходная матрица с помощью двух вложенных циклов for.
  3. Поворот матрицы осуществляется с помощью двух вложенных циклов for, где внешний цикл идет по строкам (i), а внутренний по столбцам (j).
  4. Внутренний цикл начинается с n-1 и идет до 0, чтобы элементы выводились в обратном порядке.
  5. Возвращается 0, чтобы указать, что программа успешно завершилась.
  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д

Как перевернуть матрицу на 90 градусов ?

Author24 — интернет-сервис помощи студентам

Как сделать так, чтобы числа, заданные в квадратной матрице переместились на 90 градусов?
(Сам код я написать могу, мне нужна именно формула, при помощи которой числа будет перемещены на новые места)
Благодарю за отведенное на меня время.

Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Перевернуть матрицу на 90 градусов по часовой стрелке, а затем найти строку, сумма элементов которой наименьшая
Дана матрица размером М на Н,заполненная 0 и 1. Матрицу нужно перевернуть на 90 градусов по часовой.

Перевернуть строки на 90 градусов
Вам заданы несколько строчек текста (сначала количество строчек, потом сами строчки). Вам надо.

Заполнить матрицу случайными числами. Развернуть матрицу на 90(градусов) против часовой стрелки
Заполнить матрицу случайными числами. Развернуть матрицу на 90o против часовой стрелки

Перевернуть матрицу по диагонали
Помогите пожалуйста. Задача: перевернуть матрицу по диагонали

Эксперт C

27706 / 17322 / 3812
Регистрация: 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; };

MrMurder / MatrixRotation

Save MrMurder/4f2ff3353e246ec267303f8cc7f8f470 to your computer and use it in GitHub Desktop.

Повернуть матрицу на 90 (180, 270) градусов против часовой стрелки

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters

public class MatrixRotation
static void createMatrix(int[][] a)
for (int i = 0; i < a.length; i++)
for (int j = 0; j < a.length; j++)
System.out.print(a[i][j] + » «);
>
System.out.println();
>
System.out.println();
>
static void rotateM270(int[][] a)
int[][] b = new int[a.length][a.length];
for (int i = 0; i < b.length; i++)
for (int j = 0; j < b.length; j++)
b[i][j] = a[j][a.length — i — 1];
>
>
System.out.println(«Rotating by 270 degree»);
createMatrix(b);
>
static void rotateM90(int[][] a)
int[][] b = new int[a.length][a.length];
for (int i = 0; i < b.length; i++)
for (int j = 0; j < b.length; j++)
b[j][i] = a[a.length — i — 1][j];
>
>
System.out.println(«This matrix is rotated by 90 degree:»);
createMatrix(b);
>
static void rotateM180(int[][] a)
int[][] b = new int[a.length][a.length];
for (int i = 0; i < b.length; i++)
for (int j = 0; j < b.length; j++)
b[j][i] = a[a.length — j — 1][a.length — i — 1];
>
>
System.out.println(«This matrix is rotated by 180 degree:»);
createMatrix(b);
>
public static void main(String[] args)
int[][] a = , , >;
System.out.println(«Original matrix:»);
createMatrix(a);
rotateM270(a);
rotateM90(a);
rotateM180(a);
>
>

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *