Transposing MxN Matrix in-place

https://en.wikipedia.org/wiki/Transpose

by Amy L

HTML

<diV id="output"></diV>

CSS

.example {
  display: flex;
  flex-direction: row;
}
table {
  background-color: #eee;
  margin: 1rem;
}
td {
  font-family: Courier New, monospace;
  font-weight: bold;
  min-width: 1.5rem;
  padding: .25rem;
  text-align: center;
  vertical-align: middle;
}
caption {
  font-style: italic;
}
code {
  display: inline-block;
  text-align: left;
}

JavaScript

const m1x1 = [
	[1]
];
const m1x2 = [
	[1],
  [2]
];
const m2x1 = [
	[1,2]
];
const m2x2 = [
	[1,2],
	[3,4]
];
const m3x1 = [
	[1,2,3]
];
const m1x3 = [
	[1],
  [2],
  [3]
];
const m3x2 = [
	[1,2,3],
  [4,5,6]
];
const m2x3 = [
	[1,2],
  [3,4],
  [5,6]
];
const m3x3 = [
	[1,2,3],
  [4,5,6],
  [7,8,9]
];
const m4x1 = [
	[1,2,3,4]
];
const m1x4 = [
	[1],
  [2],
  [3],
  [4]
];
const m4x2 = [
	[1,2,3,4],
  [5,6,7,8]
];
const m2x4 = [
	[1,2],
  [3,4],
	[5,6],
  [7,8]
];
const m4x3 = [
	[1,2,3,4],
  [5,6,7,8],
  [9,10,11,12]
];
const m3x4 = [
	[1,2,3],
  [4,5,6],
  [7,8,9],
  [10,11,12]
];
const m4x4 = [
	[1,2,3,4],
  [5,6,7,8],
  [9,10,11,12],
  [13,14,15,16]
];
let outputEl;
document.addEventListener('DOMContentLoaded', () => {
	outputEl = document.getElementById('output');
  transpose(m1x1);
  
  transpose(m1x2);
  transpose(m2x1);
  transpose(m2x2);
  
	transpose(m1x3);
  transpose(m3x1);
  transpose(m2x3);
  transpose(m3x2);
  transpose(m3x3);
  
  transpose(m1x4);
  transpose(m4x1);
  transpose(m2x4);
  transpose(m4x2);
  transpose(m4x3);
  transpose(m3x4);
  transpose(m4x4);
  
});
function transpose(matrix) {
  const {lengthX, lengthY} = getDimension(matrix);
	const containerEl = document.createElement('div');
  containerEl.className = 'example';
	containerEl.append(toTable(matrix,'M'));
  const halfX = half(lengthX);
  const halfY = half(lengthY);
  if (lengthX === lengthY) {
  	for (let y=0; y <= halfY; y++) {
      for (let x=0; x <= halfX && x !== y; x++) {
      	swap(matrix, x, y, lengthX, lengthY);
      }
    }
  } else if (lengthX > lengthY) {
    for (let x=0; x <= halfX; x++) {
    	for (let y=0; y <= halfY && x > y; y++) {
        swap(matrix, x, y, lengthX, lengthY);
      }
    } 
  } else if (lengthX < lengthY) {
    for (let y=0; y <= halfY; y++) {
      for (let x=0; x <= halfX && x < y; x++) {
        swap(matrix, x, y, lengthX, lengthY);
      }
    }
  }
  trimMatrix(matrix, lengthX, lengthY);
  containerEl.append(toTable(matrix,...