PHP使用数组实现矩阵数学运算的方法示例

5年以前  |  阅读数:351 次  |  编程语言:PHP 

本文实例讲述了PHP使用数组实现矩阵数学运算的方法。分享给大家供大家参考,具体如下:

矩阵运算就是对两个数据表进行某种数学运算,并得到另一个数据表.
下面的例子中我们创建了一个基本完整的矩阵运算函数库,以便用于矩阵操作的程序中.

来自 PHP5 in Practice (U.S.)Elliott III & Jonathan D.Eisenhamer


    <?php
    // A Library of Matrix Math functions.
    // All assume a Matrix defined by a 2 dimensional array, where the first
    // index (array[x]) are the rows and the second index (array[x][y])
    // are the columns
    // First create a few helper functions
    // A function to determine if a matrix is well formed. That is to say that
    // it is perfectly rectangular with no missing values:
    function _matrix_well_formed($matrix) {
      // If this is not an array, it is badly formed, return false.
      if (!(is_array($matrix))) {
        return false;
      } else {
        // Count the number of rows.
        $rows = count($matrix);
        // Now loop through each row:
        for ($r = 0; $r < $rows; $r++) {
          // Make sure that this row is set, and an array. Checking to
          // see if it is set is ensuring that this is a 0 based
          // numerically indexed array.
          if (!(isset($matrix[$r]) && is_array($matrix[$r]))) {
            return false;
          } else {
            // If this is row 0, calculate the columns in it:
            if ($r == 0) {
              $cols = count($matrix[$r]);
            // Ensure that the number of columns is identical else exit
            } elseif (count($matrix[$r]) != $cols) {
              return false;
            }
            // Now, loop through all the columns for this row
            for ($c = 0; $c < $cols; $c++) {
              // Ensure this entry is set, and a number
              if (!(isset($matrix[$r][$c]) &&
                  is_numeric($matrix[$r][$c]))) {
                return false;
              }
            }
          }
        }
      }
      // Ok, if we actually made it this far, then we have not found
      // anything wrong with the matrix.
      return true;
    }
    // A function to return the rows in a matrix -
    //  Does not check for validity, it assumes the matrix is well formed.
    function _matrix_rows($matrix) {
      return count($matrix);
    }
    // A function to return the columns in a matrix -
    //  Does not check for validity, it assumes the matrix is well formed.
    function _matrix_columns($matrix) {
      return count($matrix[0]);
    }
    // This function performs operations on matrix elements, such as addition
    // or subtraction. To use it, pass it 2 matrices, and the operation you
    // wish to perform, as a string: '+', '-'
    function matrix_element_operation($a, $b, $operation) {
      // Verify both matrices are well formed
      $valid = false;
      if (_matrix_well_formed($a) && _matrix_well_formed($b)) {
        // Make sure they have the same number of columns & rows
        $rows = _matrix_rows($a);
        $columns = _matrix_columns($a);
        if (($rows == _matrix_rows($b)) &&
            ($columns == _matrix_columns($b))) {
          // We have a valid setup for continuing with element math
          $valid = true;
        }
      }
      // If invalid, return false
      if (!($valid)) { return false; }
      // For each element in the matrices perform the operatoin on the
      // corresponding element in the other array to it:
      for ($r = 0; $r < $rows; $r++) {
        for ($c = 0; $c < $columns; $c++) {
          eval('$a[$r][$c] '.$operation.'= $b[$r][$c];');
        }
      }
      // Return the finished matrix:
      return $a;
    }
    // This function performs full matrix operations, such as matrix addition
    // or matrix multiplication. As above, pass it to matrices and the
    // operation: '*', '-', '+'
    function matrix_operation($a, $b, $operation) {
      // Verify both matrices are well formed
      $valid = false;
      if (_matrix_well_formed($a) && _matrix_well_formed($b)) {
        // Make sure they have complementary numbers of rows and columns.
        // The number of rows in A should be the number of columns in B
        $rows = _matrix_rows($a);
        $columns = _matrix_columns($a);
        if (($columns == _matrix_rows($b)) &&
            ($rows == _matrix_columns($b))) {
          // We have a valid setup for continuing
          $valid = true;
        }
      }
      // If invalid, return false
      if (!($valid)) { return false; }
      // Create a blank matrix the appropriate size, initialized to 0
      $new = array_fill(0, $rows, array_fill(0, $rows, 0));
      // For each row in a ...
      for ($r = 0; $r < $rows; $r++) {
        // For each column in b ...
        for ($c = 0; $c < $rows; $c++) {
          // Take each member of column b, with each member of row a
          // and add the results, storing this in the new table:
          // Loop over each column in A ...
          for ($ac = 0; $ac < $columns; $ac++) {
            // Evaluate the operation
            eval('$new[$r][$c] += $a[$r][$ac] '.
              $operation.' $b[$ac][$c];');
          }
        }
      }
      // Return the finished matrix:
      return $new;
    }
    // A function to perform scalar operations. This means that you take the scalar value,
    // and the operation provided, and apply it to every element.
    function matrix_scalar_operation($matrix, $scalar, $operation) {
      // Verify it is well formed
      if (_matrix_well_formed($matrix)) {
        $rows = _matrix_rows($matrix);
        $columns = _matrix_columns($matrix);
        // For each element in the matrix, multiply by the scalar
        for ($r = 0; $r < $rows; $r++) {
          for ($c = 0; $c < $columns; $c++) {
            eval('$matrix[$r][$c] '.$operation.'= $scalar;');
          }
        }
        // Return the finished matrix:
        return $matrix;
      } else {
        // It wasn't well formed:
        return false;
      }
    }
    // A handy function for printing matrices (As an HTML table)
    function matrix_print($matrix) {
      // Verify it is well formed
      if (_matrix_well_formed($matrix)) {
        $rows = _matrix_rows($matrix);
        $columns = _matrix_columns($matrix);
        // Start the table
        echo '<table>';
        // For each row in the matrix:
        for ($r = 0; $r < $rows; $r++) {
          // Begin the row:
          echo '<tr>';
          // For each column in this row
          for ($c = 0; $c < $columns; $c++) {
            // Echo the element:
            echo "<td>{$matrix[$r][$c]}</td>";
          }
          // End the row.
          echo '</tr>';
        }
        // End the table.
        echo "</table>/n";
      } else {
        // It wasn't well formed:
        return false;
      }
    }
    // Let's do some testing. First prepare some formatting:
    echo "<mce:style><!--
    table { border: 1px solid black; margin: 20px; }
    td { text-align: center; }
    --></mce:style><style mce_bogus="1">table { border: 1px solid black; margin: 20px; }
    td { text-align: center; }</style>/n";
    // Now let's test element operations. We need identical sized matrices:
    $m1 = array(
      array(5, 3, 2),
      array(3, 0, 4),
      array(1, 5, 2),
      );
    $m2 = array(
      array(4, 9, 5),
      array(7, 5, 0),
      array(2, 2, 8),
      );
    // Element addition should give us: 9  12   7
    //                 10   5   4
    //                  3   7  10
    matrix_print(matrix_element_operation($m1, $m2, '+'));
    // Element subtraction should give us:   1  -6  -3
    //                    -4  -5   4
    //                    -1   3  -6
    matrix_print(matrix_element_operation($m1, $m2, '-'));
    // Do a scalar multiplication on the 2nd matrix:  8 18 10
    //                        14 10  0
    //                         4  4 16
    matrix_print(matrix_scalar_operation($m2, 2, '*'));
    // Define some matrices for full matrix operations.
    // Need to be complements of each other:
    $m3 = array(
      array(1, 3, 5),
      array(-2, 5, 1),
      );
    $m4 = array(
      array(1, 2),
      array(-2, 8),
      array(1, 1),
      );
    // Matrix multiplication gives: 0  31
    //                -11  37
    matrix_print(matrix_operation($m3, $m4, '*'));
    // Matrix addition gives:   9 20
    //              4 15
    matrix_print(matrix_operation($m3, $m4, '+'));
    ?>

PS:这里再为大家推荐几款在线计算工具供大家参考使用:

在线一元函数(方程)求解计算工具:
http://tools.jb51.net/jisuanqi/equ_jisuanqi

科学计算器在线使用_高级计算器在线计算:
http://tools.jb51.net/jisuanqi/jsqkexue

在线计算器_标准计算器:
http://tools.jb51.net/jisuanqi/jsq

更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP数学运算技巧总结》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《PHP数组(Array)操作技巧大全》、《PHP常用遍历算法与技巧总结》、《PHP数据结构与算法教程》、《php程序设计算法总结》、《php正则表达式用法总结》及《php常见数据库操作技巧汇总

希望本文所述对大家PHP程序设计有所帮助。

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例