【问题标题】:Matrix multiplication in phpphp中的矩阵乘法
【发布时间】:2020-04-26 20:57:44
【问题描述】:

虽然矩阵的顺序应该没问题,但下面的代码会抛出异常。这可能是一件小事,我无法注意到,但无法弄清楚。

<?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);
?>

【问题讨论】:

  • 您不能将 1x2 矩阵乘以 1x2 矩阵; $mat2 应该是一个 2x1 矩阵:$mat2 = array(array(1),array(5));
  • 马克,他还缺少包裹在他们周围的array( )。他本质上是在这里定义向量,而不是二维数组。

标签: php matrix


【解决方案1】:

您在两个方面指定了错误的测试矩阵:

  1. 数组不是二维的(即数字数组的数组)。
  2. 即使您将另一个array( ) 包裹在它们周围,第一个矩阵的宽度等于第二个矩阵的高度的条件也不适用于 [5 1] 和 [1 5],它们都是2 宽 1 高。

你需要的是类似的东西

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

【讨论】:

  • 如何访问其中的元素?它不是多维数组,所以它不会让事情变得更复杂吗?
  • 是的,这些都是多维的。尝试var_dump()ing 他们以查看更好的表示。关于如何访问多维数组中的元素,请检查代码中的 $m3[$i][$j]+=$m1[$i][$k]*$m2[$k][$j]; 行。
【解决方案2】:

只是为了解决这个问题。这是一个可行的解决方案:

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;
  }
}

【讨论】:

    【解决方案3】:

    return 前必须删除大括号。

    <?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);
    ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-11
      • 2017-03-11
      • 2013-12-23
      • 1970-01-01
      • 2014-09-19
      • 1970-01-01
      相关资源
      最近更新 更多