alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

Struts example source code file (matrix.js)

This example Struts source code file (matrix.js) is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Java - Struts tags/keywords

can't, can't, determinant, equals, equals, invertible, invertible, not, not

The Struts matrix.js source code

/*
	Copyright (c) 2004-2006, The Dojo Foundation
	All Rights Reserved.

	Licensed under the Academic Free License version 2.1 or above OR the
	modified BSD license. For more information on Dojo licensing, see:

		http://dojotoolkit.org/community/licensing.shtml
*/



dojo.provide("dojo.math.matrix");
dojo.math.matrix.iDF = 0;
dojo.math.matrix.ALMOST_ZERO = 1e-10;
dojo.math.matrix.multiply = function (a, b) {
	var ay = a.length;
	var ax = a[0].length;
	var by = b.length;
	var bx = b[0].length;
	if (ax != by) {
		dojo.debug("Can't multiply matricies of sizes " + ax + "," + ay + " and " + bx + "," + by);
		return [[0]];
	}
	var c = [];
	for (var k = 0; k < ay; k++) {
		c[k] = [];
		for (var i = 0; i < bx; i++) {
			c[k][i] = 0;
			for (var m = 0; m < ax; m++) {
				c[k][i] += a[k][m] * b[m][i];
			}
		}
	}
	return c;
};
dojo.math.matrix.product = function () {
	if (arguments.length == 0) {
		dojo.debug("can't multiply 0 matrices!");
		return 1;
	}
	var result = arguments[0];
	for (var i = 1; i < arguments.length; i++) {
		result = dojo.math.matrix.multiply(result, arguments[i]);
	}
	return result;
};
dojo.math.matrix.sum = function () {
	if (arguments.length == 0) {
		dojo.debug("can't sum 0 matrices!");
		return 0;
	}
	var result = dojo.math.matrix.copy(arguments[0]);
	var rows = result.length;
	if (rows == 0) {
		dojo.debug("can't deal with matrices of 0 rows!");
		return 0;
	}
	var cols = result[0].length;
	if (cols == 0) {
		dojo.debug("can't deal with matrices of 0 cols!");
		return 0;
	}
	for (var i = 1; i < arguments.length; ++i) {
		var arg = arguments[i];
		if (arg.length != rows || arg[0].length != cols) {
			dojo.debug("can't add matrices of different dimensions: first dimensions were " + rows + "x" + cols + ", current dimensions are " + arg.length + "x" + arg[0].length);
			return 0;
		}
		for (var r = 0; r < rows; r++) {
			for (var c = 0; c < cols; c++) {
				result[r][c] += arg[r][c];
			}
		}
	}
	return result;
};
dojo.math.matrix.inverse = function (a) {
	if (a.length == 1 && a[0].length == 1) {
		return [[1 / a[0][0]]];
	}
	var tms = a.length;
	var m = dojo.math.matrix.create(tms, tms);
	var mm = dojo.math.matrix.adjoint(a);
	var det = dojo.math.matrix.determinant(a);
	var dd = 0;
	if (det == 0) {
		dojo.debug("Determinant Equals 0, Not Invertible.");
		return [[0]];
	} else {
		dd = 1 / det;
	}
	for (var i = 0; i < tms; i++) {
		for (var j = 0; j < tms; j++) {
			m[i][j] = dd * mm[i][j];
		}
	}
	return m;
};
dojo.math.matrix.determinant = function (a) {
	if (a.length != a[0].length) {
		dojo.debug("Can't calculate the determiant of a non-squre matrix!");
		return 0;
	}
	var tms = a.length;
	var det = 1;
	var b = dojo.math.matrix.upperTriangle(a);
	for (var i = 0; i < tms; i++) {
		var bii = b[i][i];
		if (Math.abs(bii) < dojo.math.matrix.ALMOST_ZERO) {
			return 0;
		}
		det *= bii;
	}
	det = det * dojo.math.matrix.iDF;
	return det;
};
dojo.math.matrix.upperTriangle = function (m) {
	m = dojo.math.matrix.copy(m);
	var f1 = 0;
	var temp = 0;
	var tms = m.length;
	var v = 1;
	dojo.math.matrix.iDF = 1;
	for (var col = 0; col < tms - 1; col++) {
		if (typeof m[col][col] != "number") {
			dojo.debug("non-numeric entry found in a numeric matrix: m[" + col + "][" + col + "]=" + m[col][col]);
		}
		v = 1;
		var stop_loop = 0;
		while ((m[col][col] == 0) && !stop_loop) {
			if (col + v >= tms) {
				dojo.math.matrix.iDF = 0;
				stop_loop = 1;
			} else {
				for (var r = 0; r < tms; r++) {
					temp = m[col][r];
					m[col][r] = m[col + v][r];
					m[col + v][r] = temp;
				}
				v++;
				dojo.math.matrix.iDF *= -1;
			}
		}
		for (var row = col + 1; row < tms; row++) {
			if (typeof m[row][col] != "number") {
				dojo.debug("non-numeric entry found in a numeric matrix: m[" + row + "][" + col + "]=" + m[row][col]);
			}
			if (typeof m[col][row] != "number") {
				dojo.debug("non-numeric entry found in a numeric matrix: m[" + col + "][" + row + "]=" + m[col][row]);
			}
			if (m[col][col] != 0) {
				var f1 = (-1) * m[row][col] / m[col][col];
				for (var i = col; i < tms; i++) {
					m[row][i] = f1 * m[col][i] + m[row][i];
				}
			}
		}
	}
	return m;
};
dojo.math.matrix.create = function (a, b, value) {
	if (!value) {
		value = 0;
	}
	var m = [];
	for (var i = 0; i < b; i++) {
		m[i] = [];
		for (var j = 0; j < a; j++) {
			m[i][j] = value;
		}
	}
	return m;
};
dojo.math.matrix.ones = function (a, b) {
	return dojo.math.matrix.create(a, b, 1);
};
dojo.math.matrix.zeros = function (a, b) {
	return dojo.math.matrix.create(a, b, 0);
};
dojo.math.matrix.identity = function (size, scale) {
	if (!scale) {
		scale = 1;
	}
	var m = [];
	for (var i = 0; i < size; i++) {
		m[i] = [];
		for (var j = 0; j < size; j++) {
			m[i][j] = (i == j ? scale : 0);
		}
	}
	return m;
};
dojo.math.matrix.adjoint = function (a) {
	var tms = a.length;
	if (tms <= 1) {
		dojo.debug("Can't find the adjoint of a matrix with a dimension less than 2");
		return [[0]];
	}
	if (a.length != a[0].length) {
		dojo.debug("Can't find the adjoint of a non-square matrix");
		return [[0]];
	}
	var m = dojo.math.matrix.create(tms, tms);
	var ii = 0;
	var jj = 0;
	var ia = 0;
	var ja = 0;
	var det = 0;
	var ap = dojo.math.matrix.create(tms - 1, tms - 1);
	for (var i = 0; i < tms; i++) {
		for (var j = 0; j < tms; j++) {
			ia = 0;
			for (ii = 0; ii < tms; ii++) {
				if (ii == i) {
					continue;
				}
				ja = 0;
				for (jj = 0; jj < tms; jj++) {
					if (jj == j) {
						continue;
					}
					ap[ia][ja] = a[ii][jj];
					ja++;
				}
				ia++;
			}
			det = dojo.math.matrix.determinant(ap);
			m[i][j] = Math.pow(-1, (i + j)) * det;
		}
	}
	m = dojo.math.matrix.transpose(m);
	return m;
};
dojo.math.matrix.transpose = function (a) {
	var m = dojo.math.matrix.create(a.length, a[0].length);
	for (var i = 0; i < a.length; i++) {
		for (var j = 0; j < a[i].length; j++) {
			m[j][i] = a[i][j];
		}
	}
	return m;
};
dojo.math.matrix.format = function (a, decimal_points) {
	if (arguments.length <= 1) {
		decimal_points = 5;
	}
	function format_int(x, dp) {
		var fac = Math.pow(10, dp);
		var a = Math.round(x * fac) / fac;
		var b = a.toString();
		if (b.charAt(0) != "-") {
			b = " " + b;
		}
		var has_dp = 0;
		for (var i = 1; i < b.length; i++) {
			if (b.charAt(i) == ".") {
				has_dp = 1;
			}
		}
		if (!has_dp) {
			b += ".";
		}
		while (b.length < dp + 3) {
			b += "0";
		}
		return b;
	}
	var ya = a.length;
	var xa = ya > 0 ? a[0].length : 0;
	var buffer = "";
	for (var y = 0; y < ya; y++) {
		buffer += "| ";
		for (var x = 0; x < xa; x++) {
			buffer += format_int(a[y][x], decimal_points) + " ";
		}
		buffer += "|\n";
	}
	return buffer;
};
dojo.math.matrix.copy = function (a) {
	var ya = a.length;
	var xa = a[0].length;
	var m = dojo.math.matrix.create(xa, ya);
	for (var y = 0; y < ya; y++) {
		for (var x = 0; x < xa; x++) {
			m[y][x] = a[y][x];
		}
	}
	return m;
};
dojo.math.matrix.scale = function (k, a) {
	a = dojo.math.matrix.copy(a);
	var ya = a.length;
	var xa = a[0].length;
	for (var y = 0; y < ya; y++) {
		for (var x = 0; x < xa; x++) {
			a[y][x] *= k;
		}
	}
	return a;
};

Other Struts examples (source code examples)

Here is a short list of links related to this Struts matrix.js source code file:

... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.