2014-08-09 2 views
0

Хотя порядок матриц должен быть точным, следующий код отменяет исключение. Это может быть крошечная вещь, которую я не могу заметить, но не могу понять.Матричное умножение в php

<?php 
    $mat1 = array(5,1); 
    $mat2 = array(1,5); 
    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); 
    } 
    matrixmult($mat1,$mat2); 
?> 
+0

Вы не сможете умножить матрицу 1x2 на матрицу 1x2; $ mat2 должен быть матрицей 2x1: '$ mat2 = array (array (1), array (5));' –

+2

Mark. У него также отсутствует оболочка 'array()' вокруг них. Он, по сути, определяет векторы здесь, это не двумерные массивы. – Julian

+0

См. Также: [Matrix artihmetic в PHP?] (Http://stackoverflow.com/q/428473/562769) –

ответ

1

Вы указываете ваши матрицы тестовых неправильно, двумя способами:

  1. Массивы не двумерные (то есть, массивы массивов чисел).
  2. Даже если вы обернули вокруг них еще один array(), условие, согласно которому ширина первой матрицы будет равна высоте второй матрицы, не будет иметь место с [5 1] и [1 5], которые имеют ширину 2 и 1 максимум.

Что вам нужно что-то вроде

$mat1 = array(array(5,1)); 
$mat2 = array(array(1),array(5)); 
+0

Как вы получаете доступ к элементам внутри? Это не многомерный массив, так ли это не делает вещи более сложными? –

+1

Да, это многомерные. Попробуйте 'var_dump(), чтобы увидеть немного лучшее представление. О том, как обращаться к элементам в многомерном массиве, проверьте '' m3 [$ i] [$ j] + = $ m1 [$ i] [$ k] * $ m2 [$ k] [$ j]; 'строка в ваш код. – Julian

0

Просто округлить это. Вот рабочее решение:

function M_mult($_A,$_B) { 
    // AxB outcome is C with A's rows and B'c cols 
    $r = count($_A); 
    $c = count($_B[0]); 
    $in= count($_B); // or $_A[0]. $in is 'inner' count 

    if ($in != count($_A[0])) { 
    print("ERROR: need to have inner size of matrices match.\n"); 
    print("  : trying to multiply a ".count($_A)."x".count($_A[0])." by a ".count($_B)."x".count($_B[0])." matrix.\n"); 
    print("\n"); 
    exit(1); 
    } 

    // allocate retval 
    $retval = array(); 
    for($i=0;$i< $r; $i++) { $retval[$i] = array(); } 
    // multiplication here 
    for($ri=0;$ri<$r;$ri++) { 
     for($ci=0;$ci<$c;$ci++) { 
     $retval[$ri][$ci] = 0.0; 
     for($j=0;$j<$in;$j++) { 
      $retval[$ri][$ci] += $_A[$ri][$j] * $_B[$j][$ci]; 
     } 
     } 
    } 
    return $retval; 
    } 
} 
Смежные вопросы