Skip to content

Commit

Permalink
started lu, fixed accidental transposition
Browse files Browse the repository at this point in the history
  • Loading branch information
chrisumbel committed Dec 24, 2011
1 parent ddfa211 commit 59e75be
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 11 deletions.
18 changes: 15 additions & 3 deletions lib/node-lapack/fortranArray.js
Expand Up @@ -27,8 +27,8 @@ function jsMatrixToFortranArray(array) {
var m = array.length;
var n = array[0].length;
var fortranArrayStart = fortranArray = new FFI.Pointer(m * n * elementSize);
for(var i = 0; i < m; i++) {
for(var j = 0; j < n; j++) {
for(var j = 0; j < n; j++) {
for(var i = 0; i < m; i++) {
fortranArray.putFloat(array[i][j]);
fortranArray = fortranArray.seek(elementSize);
}
Expand All @@ -48,6 +48,18 @@ function fortranArrayToJSArray(fortranArray, n) {
return array;
}

function fortranIntArrayToJSArray(fortranArray, n) {
var array = [];

for(var i = 0; i < n; i++) {
array.push(fortranArray.getInt32());
fortranArray = fortranArray.seek(4);
}

return array;
}

module.exports.fortranArrayToJSMatrix = fortranArrayToJSMatrix;
module.exports.jsMatrixToFortranArray = jsMatrixToFortranArray;
module.exports.fortranArrayToJSArray = fortranArrayToJSArray;
module.exports.fortranArrayToJSArray = fortranArrayToJSArray;
module.exports.fortranIntArrayToJSArray = fortranIntArrayToJSArray;
1 change: 1 addition & 0 deletions lib/node-lapack/index.js
Expand Up @@ -3,3 +3,4 @@ var lapack = require('./lapack.js');
exports.sgeqrf = lapack.sgeqrf;
exports.sgesvd = lapack.sgesvd;
exports.qr = lapack.qr;
exports.sgetrf = lapack.sgetrf;
30 changes: 23 additions & 7 deletions lib/node-lapack/lapack.js
Expand Up @@ -12,7 +12,8 @@ try {
"pointer", "pointer", "pointer"]],
"SGESVD": ["void", ["pointer", "pointer", "pointer", "pointer", "pointer",
"pointer", "pointer", "pointer", "pointer", "pointer",
"pointer", "pointer", "pointer", "pointer", ]]
"pointer", "pointer", "pointer", "pointer", ]],
"SGETRF": ["void", ["pointer", "pointer", "pointer", "pointer", "pointer", "pointer"]]

});
} catch(e) {
Expand Down Expand Up @@ -47,22 +48,22 @@ function qr(matrix) {
f_k.putInt32(Math.min(m, n));
LAPACK.SORGQR(f_m, f_n, f_k, f_a, f_lda, f_tau, f_work, f_lwork, f_info);
qr['Q'] = fortranArray.fortranArrayToJSMatrix(f_a, m, n);

// zero out bottom left forming an upper right triangle matrix
for(var i = 1; i < m; i++) {
for(var j = 0; j < i; j++)
qr.R[i][j] = 0;
}

result = qr;
});

return result;
}

function sgeqrf(matrix, callback) {
var qr;

matrixOp(matrix, function(m, n, f_m, f_n, f_a, f_lda) {
var f_tau = new FFI.Pointer(m * n * FORTRAN_FLOAT);
var f_info = new FFI.Pointer(FORTRAN_INT);
Expand All @@ -86,14 +87,28 @@ function sgeqrf(matrix, callback) {
R: fortranArray.fortranArrayToJSMatrix(f_a, m, n),
tau: fortranArray.fortranArrayToJSArray(f_tau, Math.min(m, n))
};

if(callback)
qr = callback(qr, m, n, f_m, f_n, f_a, f_lda, f_tau, f_work, f_lwork, f_info);
});

return qr;
}

function sgetrf(matrix) {
var result = {};

matrixOp(matrix, function(m, n, f_m, f_n, f_a, f_lda) {
var f_ipiv = new FFI.Pointer(Math.min(m, n) * FORTRAN_INT);
var f_info = new FFI.Pointer(FORTRAN_INT);
LAPACK.SGETRF(f_m, f_n, f_a, f_lda, f_ipiv, f_info);
result.LU = fortranArray.fortranArrayToJSMatrix(f_a, m, n);
result.IPIV = fortranArray.fortranIntArrayToJSArray(f_ipiv, Math.min(m, n));
});

return result;
}

function sgesvd(jobu, jobvt, matrix) {
var f_jobu = new FFI.Pointer(FORTRAN_CHAR);
var f_jobvt = new FFI.Pointer(FORTRAN_CHAR);
Expand Down Expand Up @@ -140,4 +155,5 @@ function sgesvd(jobu, jobvt, matrix) {

exports.sgeqrf = sgeqrf;
exports.sgesvd = sgesvd;
exports.sgetrf = sgetrf;
exports.qr = qr;
2 changes: 1 addition & 1 deletion package.json
@@ -1,7 +1,7 @@
{
"name": "lapack",
"description": "",
"version": "0.0.2",
"version": "0.0.3",
"homepage": "https://github.com/NaturalNode/node-lapack",
"engines": {
"node": ">=0.2.6"
Expand Down
11 changes: 11 additions & 0 deletions spec/lapack_spec.js
Expand Up @@ -9,6 +9,17 @@ describe('lapack', function() {
[1, 1, 3]
];

it('should lu', function() {
var luIn = [
[ 4, 2, 1, 4],
[-9, 4, 3, 9],
[11, 3, 11, 3],
[-4, 5, 3, 1]
];

var result = lapack.sgetrf(luIn);
});

it('shoud sgeqrf', function() {
var qr = lapack.sgeqrf(M);

Expand Down

0 comments on commit 59e75be

Please sign in to comment.