Skip to content

Commit

Permalink
added rowByColumnMultiplication
Browse files Browse the repository at this point in the history
  • Loading branch information
fibo committed Jan 21, 2013
1 parent f0b40ed commit cf27c98
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 26 deletions.
70 changes: 47 additions & 23 deletions lib/Real/SquareMatrix.js
Original file line number Original file line Diff line number Diff line change
@@ -1,7 +1,8 @@


var _ = require('underscore');

var RealElement = require('./Element.js'); var RealElement = require('./Element.js');
var RealField = require('./Field.js'); var RealField = require('./Field.js');
var is = require('../util/is.js');


var R = new RealField(); var R = new RealField();


Expand All @@ -22,7 +23,7 @@ function RealSquareMatrix(arg) {
self.getElements = getElements; self.getElements = getElements;


// Defaults to Identity. // Defaults to Identity.
if (is.notDefined(arg.elements) { if (! _.isArray(arg.elements)) {
for (var i = 0; i < _order; i++) { for (var i = 0; i < _order; i++) {
for (var j = 0; j < _order; j++) { for (var j = 0; j < _order; j++) {
i == j ? _elements.push(R.getOne()) : _elements.push(R.getZero()); i == j ? _elements.push(R.getOne()) : _elements.push(R.getZero());
Expand All @@ -35,12 +36,16 @@ function RealSquareMatrix(arg) {
_elements.push(element); _elements.push(element);
} }


function getNumberOfColumns() { return _order; };

self.numCols = self.getNumberOfColumns = getNumberOfColumns;

function getNumberOfRows() { return _order; };


var _numRows = _order; self.numRows = self.getNumberOfRows = getNumberOfRows;
var _numCols = _order;


function getElementByIndexes(i, j) { function getElementByIndexes(i, j) {
return _elements[index(i, j, _numCols)]; return _elements[index(i, j, self.numCols())];
}; };


self.ij = self.getElementByIndexes = getElementByIndexes; self.ij = self.getElementByIndexes = getElementByIndexes;
Expand All @@ -64,54 +69,73 @@ function RealSquareMatrix(arg) {


// TODO wquesto modo di definire le funzioni sarebbe consigliabile // TODO wquesto modo di definire le funzioni sarebbe consigliabile
// per non farle anomime e avere uno stack migliore. // per non farle anomime e avere uno stack migliore.
self.row = self.getRowByIndex = function getRowByIndex(rowIndex) { function getRowByIndex(rowIndex) {
var row = []; var row = [];
for (var j = 0; j < _numCols; j++) { for (var j = 0; j < self.numCols(); j++) {
var element = self.ij(rowIndex, j); var element = self.ij(rowIndex, j);
row.push(element); row.push(element);
} }
return row; return row;
}; };


self.row = self.getRowByIndex = getRowByIndex;



function getColumnByIndex(colIndex) {
self.col = self.getColumnByIndex = function getColumnByIndex(colIndex) {
var col = []; var col = [];
for (var i = 0; i < _numRows; i++) { for (var i = 0; i < self.numRows(); i++) {
var element = self.ij(i, colIndex); var element = self.ij(i, colIndex);
col.push(element); col.push(element);
} }
return col; return col;
}; };


self.col = self.getColumnByIndex = getColumnByIndex;

function rowByColumnMultiplication(leftMatrix, rightMatrix) {
var matricesCanNotBeMultiplied = (leftMatrix.getNumberOfColumns() !== rightMatrix.getNumberOfRows());


self.mul = self.rmul = self.rightMultiplication = function rightMultiplication(matrix) {
var elements = []; var elements = [];


for (var i = 0; i < _numRows; i++) { // TODO dovrei controllare anche il Field o Ring del Gruppo di Matrici
for (var j = 0; j < _numCols; j++) { // per ora uso secco R
var element = R.getZero(); var ring = R;


for (var k = 0; k < _order; k++) { if (matricesCanNotBeMultiplied) throw new Error();

for (var i = 0; i < leftMatrix.getNumberOfRows(); i++) {
for (var j = 0; j < rightMatrix.getNumberOfColumns(); j++) {
var element = ring.getZero();

for (var k = 0; k < leftMatrix.getNumberOfColumns(); k++) {
// TODO funzione generica di somma sugli indici, tipo notazione di Einstein. // TODO funzione generica di somma sugli indici, tipo notazione di Einstein.
var rightElement = self.ij(i, k); var rightElement = leftMatrix.ij(i, k);
var leftElement = matrix.ij(k, j); var leftElement = rightMatrix.ij(k, j);
element.add(R.mul(rightElement,leftElement)); element.add(ring.mul(rightElement,leftElement));
console.log(element.num());
} }

elements.push(element); elements.push(element);
} }
} }


_elements = elements; return elements;
};

function rightMultiplication(matrix) {
_elements = rowByColumnMultiplication(self, matrix);
}; };


self.leftMultiplication = function (matrix) { self.mul = self.rmul = self.rightMultiplication = rightMultiplication;


function leftMultiplication(matrix) {
// TODO dovrei poter passare un array di matrici, cioè fare tipo
// for (var i in arguments) _elements = rowByColumnMultiplication(arguments[i], self);
_elements = rowByColumnMultiplication(matrix, self);
}; };


// TODO rightMultiplication leftMultiplication in mxn matrix // TODO rightMultiplication leftMultiplication in mxn matrix


self.lmul = self.leftMultiplication; self.lmul = self.leftMultiplication = leftMultiplication;


function getAdjointElements(rowIndex, columnIndex, numRows, numCols, elements) { function getAdjointElements(rowIndex, columnIndex, numRows, numCols, elements) {
var adjointElements = []; var adjointElements = [];
Expand Down Expand Up @@ -160,9 +184,9 @@ function RealSquareMatrix(arg) {


self.toString = function () { self.toString = function () {
var str = ''; var str = '';
for (var i = 0; i < _numRows; i++) { for (var i = 0; i < self.numRows(); i++) {
str += '|'; str += '|';
for (var j = 0; j < _numCols; j++) { for (var j = 0; j < self.numCols(); j++) {
str += ' ' + self.ij(i, j).num() + ' '; str += ' ' + self.ij(i, j).num() + ' ';
} }
str += '|\n'; str += '|\n';
Expand Down
7 changes: 4 additions & 3 deletions test/quickStart.js
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -36,10 +36,11 @@ describe('Quick start:', function () {


var m2 = new GL2R.Matrix(-1, 0, var m2 = new GL2R.Matrix(-1, 0,
0, 1); 0, 1);
//m1.mul(m2);


//assert.equal(m1.toString(),'| -1 2 |\n| -3 4 |\n'); m1.mul(m2);


//assert.equal(m1.det().num(), 2); assert.equal(m1.toString(),'| -1 2 |\n| -3 4 |\n');

assert.equal(m1.det().num(), 2);
}); });
}); });

0 comments on commit cf27c98

Please sign in to comment.