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程序设计有所帮助。