矩阵乘法与数组

时间:2014-05-12 13:22:44

标签: php arrays matrix

我有2个数组,用新格式表示矩阵:

$array1 = Array( Array(1, 2) , Array(3, 4) );
$array2 = Array( Array(0, 1) , Array(5, 6) );

这是我试过的:

$array = Array();

foreach ($array2 as $idB => $columnsB) {
    for($i = 0; $i < count($columnsB); $i++) {
        $array[$i][] = $columnsB[$i];  
    }
}

$productArray = Array();

for ($i = 0; $i < count($array1); $i++) {
    for ($j = 0; $j < count($array); $j++) {
        $productArray[$i][$j] = $array1[$i][$j] * $array[$j][$i];
    }
}

预期结果:

$array = Array(0 => Array(10, 13), 1 => Array(20,27));

但是,它不正确,因为它只从第一个数组获取line1而从seond数组获取column2

3 个答案:

答案 0 :(得分:0)

使用PHP 5.5的array_column()函数来简化对$ array2的访问:

$array1 = array( array(1, 2), array(3, 4) );
$array2 = array( array(0, 1), array(5, 6) );

$rows = count($array1);
$columns = count($array1[0]);

$result = [];
for($row = 0; $row < $rows; ++$row) {
    $rowData = $array1[$row];
    for($column = 0; $column < $columns; ++$column) {
        $columnData = array_column($array2,$column);
        $v = 0;
        foreach($rowData as $key => $valueData) {
            $v += $valueData * $columnData[$key];
        }
        $result[$row][$column] = $v;
    }
}

如果您没有PHP 5.5

function array_column($array, $column) {
    return array_map(
        function($value) use ($column) {
            return $value[$column];
        },
        $array
    );
}

答案 1 :(得分:0)

您需要额外的循环,以对单个产品求和:

for ($i = 0; $i < count($array1); $i++) {
    for ($j = 0; $j < count($array); $j++) {
        for ($k = 0; $k < count ($array[$j]); $k++) {
           $productArray[$i][$j] += $array1[$i][$k] * $array[$j][$k];
        }
    }
}

答案 2 :(得分:-1)

function matrixmult($m1,$m2){
    $r=count($m1);
    $c=count($m2[0]);
    $p=count($m2);
    if(count($m1[0])!=$p){throw new Exception('Incompatible matrixes');}
    $m3=array();
    for ($i=0;$i< $r;$i++){
        for($j=0;$j<$c;$j++){
            $m3[$i][$j]=0;
            for($k=0;$k<$p;$k++){
                $m3[$i][$j]+=$m1[$i][$k]*$m2[$k][$j];
            }
        }
    }
    return($m3);
}

输出:

print_r(matrixmult($array, $array1));

Array ( [0] => Array ( [0] => 10 [1] => 13 ) [1] => Array ( [0] => 20 [1] => 27 ) ) 

来源http://sickel.net/blogg/?p=907