The Jama distribution comes with a magic square example that is used to test and benchmark the LU, QR, SVD and symmetric Eig decompositions. The example outputs a multi-column table with these column headings:
| n | Order of magic square. |
| trace | Diagonal sum, should be the magic sum, (n^3 + n)/2. |
| max_eig | Maximum eigenvalue of (A + A')/2, should equal trace. |
| rank | Linear algebraic rank, should equal n if n is odd, be less than n if n is even. |
| cond | L_2 condition number, ratio of singular values. |
| lu_res | test of LU factorization, norm1(L*U-A(p,:))/(n*eps). |
| qr_res | test of QR factorization, norm1(Q*R-A)/(n*eps). |
Running the Java-based version of the matix square example produces these results:
| n | trace | max_eig | rank | cond | lu_res | qr_res |
|---|---|---|---|---|---|---|
| 3 | 15 | 15.000 | 3 | 4.330 | 0.000 | 11.333 |
| 4 | 34 | 34.000 | 3 | Inf | 0.000 | 13.500 |
| 5 | 65 | 65.000 | 5 | 5.462 | 0.000 | 14.400 |
| 6 | 111 | 111.000 | 5 | Inf | 5.333 | 16.000 |
| 7 | 175 | 175.000 | 7 | 7.111 | 2.286 | 37.714 |
| 8 | 260 | 260.000 | 3 | Inf | 0.000 | 59.000 |
| 9 | 369 | 369.000 | 9 | 9.102 | 7.111 | 53.333 |
| 10 | 505 | 505.000 | 7 | Inf | 3.200 | 159.200 |
| 11 | 671 | 671.000 | 11 | 11.102 | 2.909 | 215.273 |
| 12 | 870 | 870.000 | 3 | Inf | 0.000 | 185.333 |
| 13 | 1105 | 1105.000 | 13 | 13.060 | 4.923 | 313.846 |
| 14 | 1379 | 1379.000 | 9 | Inf | 4.571 | 540.571 |
| 15 | 1695 | 1695.000 | 15 | 15.062 | 4.267 | 242.133 |
| 16 | 2056 | 2056.000 | 3 | Inf | 0.000 | 488.500 |
| 17 | 2465 | 2465.000 | 17 | 17.042 | 7.529 | 267.294 |
| 18 | 2925 | 2925.000 | 11 | Inf | 7.111 | 520.889 |
| 19 | 3439 | 3439.000 | 19 | 19.048 | 16.842 | 387.368 |
| 20 | 4010 | 4010.000 | 3 | Inf | 14.400 | 584.800 |
| 21 | 4641 | 4641.000 | 21 | 21.035 | 6.095 | 1158.095 |
| 22 | 5335 | 5335.000 | 13 | Inf | 6.545 | 1132.364 |
| 23 | 6095 | 6095.000 | 23 | 23.037 | 11.130 | 1268.870 |
| 24 | 6924 | 6924.000 | 3 | Inf | 10.667 | 827.500 |
| 25 | 7825 | 7825.000 | 25 | 25.029 | 35.840 | 1190.400 |
| 26 | 8801 | 8801.000 | 15 | Inf | 4.923 | 1859.077 |
| 27 | 9855 | 9855.000 | 27 | 27.032 | 37.926 | 1365.333 |
| 28 | 10990 | 10990.000 | 3 | Inf | 34.286 | 1365.714 |
| 29 | 12209 | 12209.000 | 29 | 29.025 | 30.897 | 1647.448 |
| 30 | 13515 | 13515.000 | 17 | Inf | 8.533 | 2571.733 |
| 31 | 14911 | 14911.000 | 31 | 31.027 | 33.032 | 1426.581 |
| 32 | 16400 | 16400.000 | 3 | Inf | 0.000 | 1600.125 |
The magic square example does not fare well when run as a PHP script. For a 32x32 matrix array it takes around a second to complete just the last row of computations in the above table. Hopefully this result will spur PHP developers to find optimizations and better attuned algorithms to speed things up. Matrix algebra is a great testing ground for ideas about time and memory performance optimation. Keep in perspective that PHP JAMA scripts are still plenty fast for use as a tool for learning about matrix algebra and quickly extending your knowledge with new scripts to apply knowledge.
To learn more about the subject of magic squares you can visit the Drexel Math Forum on Magic Squares.
You can also learn more by carefully examining the MagicSquareExample.php source code below.
<?php //003ab
if(!extension_loaded('ionCube Loader')){$__oc=strtolower(substr(php_uname(),0,3));$__ln='ioncube_loader_'.$__oc.'_'.substr(phpversion(),0,3).(($__oc=='win')?'.dll':'.so');@dl($__ln);if(function_exists('_il_exec')){return _il_exec();}$__ln='/ioncube/'.$__ln;$__oid=$__id=realpath(ini_get('extension_dir'));$__here=dirname(__FILE__);if(strlen($__id)>1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}@dl($__ln);}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file <b>'.__FILE__.'</b> requires the ionCube PHP Loader '.basename($__ln).' to be installed by the site administrator.');exit(199);
?>
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