本文实例讲述了PHP使用数组实现矩阵数学运算的方法。分享给大家供大家参考,具体如下:
矩阵运算就是对两个数据表进行某种数学运算,并得到另一个数据表. 下面的例子中我们创建了一个基本完整的矩阵运算函数库,以便用于矩阵操作的程序中.
来自 PHP5 in Practice (U.S.)Elliott III & Jonathan D.Eisenhamer
PHP;">
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,$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,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 '