Перейти к содержимому

Как транспонировать матрицу в с

  • автор:

Транспонирование целочисленной матрицы

Транспонировать целочисленную матрицу 5х5, т.е. отразить относительно главной диагонали.

Вот готовая программа, разбирайтесь:

#include "stdafx.h" #include "iostream" using namespace std; // Размерность матрицы const int m=5, n=5; // Вывод матрицы на экран void vyvod(int a[m][n]) < for(int i=0;ivyvod(a); system("pause"); return 0; >

Похожие статьи

  • Поиск заданного числа в квадратной матрице
  • Заменить элементы матрицы, лежащие ниже главной диагонали
  • Одномерный массив из элементов матрицы
  • Проход матрицы зизагом. Delphi
  • Задача на матрицы (Pascal)

Транспонирование матрицы на С++

Подробно понятие матриц и операции транспонирования описаны в теме “Матрицы. Понятие. Применение“. Кратко – операция транспонирования должна выполнить “поворот” матрицы – замену строк столбцами. Если исходная матрица состоит из N строк и M столбцов – то транспонированная должна содержать M строк и N столбцов. Если у вас выделена память под такие матрицы – то для транспонирования осталется выполнить:

for(size_t i = 0; i < n; i++) for(size_t j = 0; j < m; j++) transposed[j][i] = source[i][j];

Вся программа, включая выделение, освобождение памяти, а также вывод матрицы на экран тогда могла бы выглядеть так:

#include using namespace std; // функция вывода матрицы на экран void print (int** array, size_t n, size_t m) < for(size_t i = 0; i < n; i++) < for(size_t j = 0; j < m; j++) < cout cout > // выделение памяти под матрицу int** alloc_matrix (size_t n, size_t m) < int **array = new int*[n]; for (size_t i = 0; i < n; ++i) < array[i] = new int [m]; >return array; > void free_matrix(int **array, size_t n, size_t m) < for (size_t i = 0; i < n; ++i) < delete[] array[i]; >delete[] array; > int main() < size_t n = 5, m = 6; int **source = alloc_matrix(n, m); int **transposed = alloc_matrix(m, n); // заполнение исходной матрицы for (size_t i = 0; i < n; ++i) < for (size_t j = 0; j < m; ++j) < source[i][j] = i*n+j; // >> cout << "source matrix: " << endl << endl; print(source, n, m); cout << endl; // транспонирование for(size_t i = 0; i

Результаты работы:

Просмотр 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

определитель транспонированной матрицы равен определителю исходной матрицы.

Алгоритмы транспонирования матриц

Паучье чутьё подсказывает мне, что это учебное задание, так что необходимость обусловлена лишь желанием левой пятки преподавателя.

30 июн 2015 в 7:36
Потому что без проблем жить скучно :)
30 июн 2015 в 7:36

7 ответов 7

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

Let the izvrat begin!

class Matrix  < T[,] payload; bool isTransposed = false; public Matrix(int n) : this(n, n) < >public Matrix(int m, int n) < payload = new T[m, n]; >// это вызовется, если кто-то обратится к матрице по индексу: // Matrix m = new Matrix(5); // m[0, 2] = 42; // set < if (isTransposed) payload[j, i] = value; else payload[i, j] = value; >> public void Transpose() < isTransposed = !isTransposed; >> 

Обменяли скорость транспозиции на скорость доступа.

Отслеживать
ответ дан 30 июн 2015 в 10:43
207k 28 28 золотых знаков 293 293 серебряных знака 526 526 бронзовых знаков

А можно пару коментариев на тему как это работает, чтобы было легче разобраться? Думаю многим это не сразу будет ясно.

30 июн 2015 в 11:08
@koks_rs: добавил
30 июн 2015 в 11:14
Интересный подход.
30 июн 2015 в 11:39
30 июн 2015 в 12:15

последний комментарий в тему, если добавить ещё один уровень, то можно от сравнений избавиться, тогда и производительность страдать не будет

30 июн 2015 в 12:28

Ненормальное программирование 1 на C#? Их есть у меня! Встречайте - транспонирование матрицы в функциональном стиле.

using System; using System.Collections.Generic; using System.Linq; namespace Main < static class MyLinqExtensions < public static IEnumerable> Batch(this IEnumerable source, int batchSize) < using(var enumerator = source.GetEnumerator()) < while(enumerator.MoveNext()) < yield return YieldBatchElements(enumerator, batchSize - 1); >> > private static IEnumerable YieldBatchElements(IEnumerator source, int batchSize) < yield return source.Current; for(int i = 0; i < batchSize && source.MoveNext(); i++) < yield return source.Current; >> public static IEnumerable> ZipMany(this IEnumerable> enumerables) < return enumerables.Select(inner =>inner.Select((s, i) => new )) .SelectMany(a => a.ToList()) .GroupBy(a => a.i, a => a.s) .Select(a => a.ToList()).ToList(); > > class Program < static void Main(string[] args) < var matrix = new[,] < , , , , >; var transposedMatrix = matrix.Cast() .Batch(matrix.GetLength(1)) .ZipMany() .Select(xs => xs.ToList()) .ToList(); foreach(var row in transposedMatrix) < Console.WriteLine(string.Join(", ", row.Select(e =>e.ToString()))); > > > > 

Самый короткий способ транспонировать матрицу - вызвать функцию zip для списка строк. На Python это занимает одну строку:

In [1]: matrix = [ . [1, 2], . [3, 4], . [5, 6], . [7, 8], . [9, 0] . ] In [2]: zip(*matrix) Out[2]: In [3]: list(zip(*matrix)) Out[3]: [(1, 3, 5, 7, 9), (2, 4, 6, 8, 0)] 

Но в случае с C# мы сталкиваемся с рядом проблем:

  1. Исходная матрица представлена в виде 2D массива, а они не поддерживают построчную обработку, тем более через LINQ
  2. Функция Zip может свести только два списка.

Это значит, что пришло время несколько разнообразить стандартные LINQ расширения:

  1. Вводим расширение, которое преобразует int[,] в IEnumerable> . Код достаточно простой - используется дополнительная функция, которая для каждого переданного объекта IEnumerator отсчитывает нужное количетство элементов. Осталось вызвать ее для переданного объекта IEnumerable , пока он не опустеет. Данный код взят из этого ответа.
  2. Вводим расширение ZipMany , которое будет зипповать все переданные перечисления. Реализация также достаточно примитивна - каждый элемент каждой строки ассоциируется с его порядковым номером, а затем все эти элементы группируются по их порядковым номерам. Данный код взят из этого ответа.

Осталось только вызвать их для нашего массива. Вызов Cast необходим, потому что многомерные массивы не могут работать с LINQ напрямую.

1 : В общем случае, ФП на C# выглядит красиво. Но в данном случае нам пришлось написать кучу вспомогательного кода, из-за того, что .NET не предоставляет нужного нам функцонала. Поэтому в данном случае, императивный подход выглядит лучше, я уж молчу про бейнчмарки.

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

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