欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-03-09 13:40:47
本文实例讲述了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:这里再为大家推荐几款在线计算工具供大家参考使用:

在线一元函数(方程)求解计算工具:

科学计算器在线使用_高级计算器在线计算:

在线计算器_标准计算器:

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

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