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,...