как транспонировать 2D матрицу на место?
Как транспонировать многомерный массив на место
comment
квадратный или нет? это имеет большое значение
- person Anycorn   schedule 21.04.2010
comment
@aaa: перенос неквадратной матрицы на место не имеет большого смысла.
- person Jens   schedule 21.04.2010
comment
Хотя в зависимости от представления (например, с использованием одного массива измерений N * M) это можно сделать.
- person Matthieu M.   schedule 21.04.2010
comment
Это было в значительной степени избито до смерти в этом сообщении
- person NealB   schedule 09.11.2011
comment
@Jens Имеет смысл хранить все матричные данные в одном массиве.
- person Waruyama   schedule 15.01.2020
Ответы (8)
В Википедии была статья «Транспозиция матрицы на месте». В статье рассматриваются неквадратные матрицы.
http://en.wikipedia.org/wiki/In-place_matrix_transposition
person
dlb
schedule
21.04.2010
Вы не указали язык, но обычно вы делаете следующее:
let a be your array.
for each i,j with i<j switch a[i,j] with a[j,i]
person
Jens
schedule
21.04.2010
Это тоже верно только для квадратной матрицы. Работать с неквадратными матрицами на удивление сложно.
- person Waruyama; 15.01.2020
Чтобы получить транспонирование квадратной матрицы, нам нужно рассмотреть элементы выше главной диагонали или ниже нее и поменять местами каждый с его отражением вдоль главной диагонали:
for i->0 to N-1
for j->i+1 to N-1
swap matrix[i][j] with matrix[j][i]
person
codaddict
schedule
21.04.2010
for(i=0;i<N;i++)
for(j=0;j<N;j++)
if(i!=j && j>i)
{
temp=a[i][j];
a[i][j]=a[j][i];
a[j][i]=temp;
}
(N
- размер вашего массива)
person
dimmat
schedule
07.05.2015
Зачем беспокоиться ? Просто поменяйте местами индексы в любом операторе доступа.
person
High Performance Mark
schedule
21.04.2010
Существует серьезное снижение производительности за доступ к 2D-массивам в неправильном порядке - часто лучше заплатить цену транспонирования, чтобы получить преимущества непрерывного доступа к памяти (единичный шаг).
- person Paul R; 21.04.2010
in c#
string[,] Value;
//fill Value
//create transposed array
ValueAux = new string[Value.GetLength(1),Value.GetLength(0)];
for (i = 0; i < Value.GetLength(0); i++)
{
for (j = 0; j < Value.GetLength(1); j++)
{
Valueaux[j, i] = Value[i, j];
}
}
Результат в ValueAux
person
Biggum
schedule
23.08.2013
Кажется, это работает хорошо:
function transpose(a)
{
return Object.keys(a[0]).map(function (c) { return a.map(function (r) { return r[c]; }); });
}
person
JWally
schedule
27.04.2013
person
schedule
ПРЕДУПРЕЖДЕНИЕ! Это верно только для квадратных массивов. См. Ссылку на Википедию @dlb ниже для реализации неквадратной матрицы.
- person Mayank; 07.04.2014