我想将矩阵顺时针旋转90度。这相当于使输入中的第一列成为输出的第一行,输入的第二列成为输出的第二行,输入的第三列成为输出的第3行。请注意,列的底部=行的开头,因为旋转90度。
例如:
$matrix= [[1, 2, 3]
[4, 5, 6],
[7, 8, 9]];
rotate90degrees($matrix)= [[7, 4, 1],
[8, 5, 2],
[9, 6, 3]]
我所知道的是我首先转置矩阵,然后交换列以将矩阵旋转90度。如何将其应用于php?
答案 0 :(得分:7)
我向您展示了如何转换数组以回答previous question,旋转90度,使用该转置逻辑,然后依次颠倒每行中值的顺序:
$matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
];
array_unshift($matrix, null);
$matrix = call_user_func_array('array_map', $matrix);
$matrix = array_map('array_reverse', $matrix);
var_dump($matrix);
答案 1 :(得分:2)
php没有像矩阵的“转置”这样的概念而没有添加某种线性代数库。 你可以通过遍历矩阵并交换一些索引来原生地实现它
<?php
function rotate90($mat) {
$height = count($mat);
$width = count($mat[0]);
$mat90 = array();
for ($i = 0; $i < $width; $i++) {
for ($j = 0; $j < $height; $j++) {
$mat90[$height - $i - 1][$j] = $mat[$height - $j - 1][$i];
}
}
return $mat90;
}
$mat = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
print_r($mat);
//123
//456
//789
print_r(rotate90($mat));
//741
//852
//963
$mat = [[1, 2, 3], [4, 5, 6], [7, 8, 9], ["a", "b", "c"]];
print_r($mat);
//123
//456
//789
//abc
print_r(rotate90($mat));
//a741
//b852
//c963
答案 2 :(得分:2)
另一个可靠的选择:
function rotateMatrix90( $matrix )
{
$matrix = array_values( $matrix );
$matrix90 = array();
// make each new row = reversed old column
foreach( array_keys( $matrix[0] ) as $column ){
$matrix90[] = array_reverse( array_column( $matrix, $column ) );
}
return $matrix90;
}
远不如@ mark-baker的聪明。也许更清楚。
答案 3 :(得分:1)
您可以一站式,两步过程来简洁地转置矩阵数据。第一个array_map()
内部调用将列数据转换为行数据。第二个array_map()
调用反转行数据的顺序。 *请注意,幸运的是,对于这种情况,splat运算符(...
)仅解包索引元素,因此不需要数据准备。
代码:(Demo)
$matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
];
var_export(array_map('array_reverse', array_map(null, ...$matrix)));
输出:
[[7,4,1],
[8,5,2],
[9,6,3]]
答案 4 :(得分:0)
下面的代码正在使用额外的空间。
<?php
function rotate90degrees()
{
$matrix = [[1,2,3],
[4,5,6],
[7,8,9]];
$k = 0;
$len = count($matrix[0]);
$tmp = [];
// Create a new matrix with [[0,0,0],[0,0,0],[0,0,0]]
while($k < $len) {
$row = [];
$l = 0;
while($l < $len) {
$row[] = 0;
$l++;
}
$tmp[] = $row;
$k++;
}
// Rotate through the given matrix and fill out the above created new matrix
for($i=0; $i<$len; $i++) {
for($j=$len-1; $j>=0; $j--) {
$tmp[$i][$j] = $matrix[$j][$i];
}
$tmp[$i] = array_reverse($tmp[$i]);
}
return $matrix;
}
以下功能不占用额外的空间。
<?php
function rotate90degreesWithoutAdditionalSpace()
{
$matrix = [[1,2,3],
[4,5,6],
[7,8,9]];
$len = count($matrix);
// Swap the rows columns.
for($i=0; $i<$len; $i++) {
for($j=$i; $j<$len; $j++) {
$tmp = $matrix[$i][$j];
$matrix[$i][$j] = $matrix[$j][$i];
$matrix[$j][$i] = $tmp;
}
}
// Swap the elements from both ends of each row until the centered element in the row.
for($i=0; $i<$len; $i++) {
for($j=0; $j<floor($len/2); $j++) {
$tmp = $matrix[$i][$j];
$matrix[$i][$j] = $matrix[$i][$len-1-$j];
$matrix[$i][$len-1-$j] = $tmp;
}
}
return $matrix;
}
答案 5 :(得分:0)
您可以使用以下代码旋转矩阵 cw:
function rotateCW($arr){
return array_map(function($row, $i) use ($arr){
return array_reverse(array_column($arr, $i));
}, $arr[0], array_keys($arr[0]));
}
并使用以下代码逆时针旋转:
function rotateCCW($arr){
return array_map(function($row, $i) use ($arr){
return array_column($arr, count($arr[0]) - 1 -$i);
}, $arr[0], array_keys($arr[0]));
}