本文实例讲述了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 10matrix_print(matrix_element_operation($m1, $m2, '+'));// Element subtraction should give us: 1 -6 -3// -4 -5 4// -1 3 -6matrix_print(matrix_element_operation($m1, $m2, '-'));// Do a scalar multiplication on the 2nd matrix: 8 18 10// 14 10 0// 4 4 16matrix_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 37matrix_print(matrix_operation($m3, $m4, '*'));// Matrix addition gives: 9 20// 4 15matrix_print(matrix_operation($m3, $m4, '+'));?>
新闻热点
疑难解答