Как транспонировать многомерный массив на место

как транспонировать 2D матрицу на место?


person Jony    schedule 21.04.2010    source источник
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
comment
Это тоже верно только для квадратной матрицы. Работать с неквадратными матрицами на удивление сложно. - 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
comment
Существует серьезное снижение производительности за доступ к 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
comment
ПРЕДУПРЕЖДЕНИЕ! Это верно только для квадратных массивов. См. Ссылку на Википедию @dlb ниже для реализации неквадратной матрицы. - person Mayank; 07.04.2014