j6
Version:
Javascript scientific library (like R, NumPy, Matlab)
232 lines (210 loc) • 5.2 kB
JavaScript
module.exports = function (j6) {
/* eslint-disable one-var */
var N = require('numeric')
var M = j6.M = {}
M.sparse = N.ccsSparse // Matrix => Sparse
M.sparse2full = N.ccsFull // Sparse => Matrix
// j6.complex=N.t
// matrix
M.svd = N.svd
// j6.det = N.det
// j6.inv = N.inv
M.lu = N.cLU
M.luSolve = N.cLUsolve
// j6.dot = N.dot
// j6.rep = N.rep
// j6.tr = N.transpose
// j6.diag = N.diag
// j6.sumM = N.sum
M.str = N.prettyPrint
M.rows = function (m) { return m.length }
M.cols = function (m) { return m[0].length }
M.row = function (m, i) { return m[i] }
M.col = function (m, j) {
var rows = m.length
var c = new Array(rows)
for (var i = 0; i < rows; i++) {
c[i] = m[i][j]
}
return c
}
M.new = function (rows, cols, value = 0) {
return j6.T.repeat([rows, cols], value)
}
M.random = function (rows, cols, a, b) {
return j6.T.random([rows, cols], a, b)
}
M.rowSum = function (m) {
var rows = m.length
var s = new Array(rows)
for (var i = 0; i < rows; i++) {
s[i] = j6.T.sum(m[i])
}
return s
}
M.colSum = function (m) {
var rows = m.length
if (rows === 0) return []
var s = m[0]
for (var i = 1; i < rows; i++) {
s = j6.V.add(s, m[i])
}
return s
}
M.rowMean = function (m) {
return M.rowSum(m).div(m.cols())
}
M.colMean = function (m) {
return M.colSum(m).div(m.rows())
}
M.addv = function (m, v) {
var rows = m.length
var r = new Array(rows)
for (var i = 0; i < rows; i++) {
r[i] = j6.V.add(m[i], v) // 這行比較快 (使用多型速度會變慢)
}
return r
}
M.add = function (m1, m2) {
var rows = m1.length
var r = new Array(rows)
for (var i = 0; i < rows; i++) {
r[i] = j6.V.add(m1[i], m2[i])
}
return r
}
M.sub = function (m1, m2) {
var rows = m1.length
var r = new Array(rows)
for (var i = 0; i < rows; i++) {
r[i] = j6.V.sub(m1[i], m2[i])
}
return r
}
M.mul = function (m1, m2) {
var rows = m1.length
var r = new Array(rows)
for (var i = 0; i < rows; i++) {
r[i] = j6.V.mul(m1[i], m2[i])
}
return r
}
M.div = function (m1, m2) {
var rows = m1.length
var r = new Array(rows)
for (var i = 0; i < rows; i++) {
r[i] = j6.V.div(m1[i], m2[i])
}
return r
}
M.fillv = function (v, rows, cols) {
var m = new Array(rows)
for (var r = 0; r < rows; r++) {
var mr = m[r] = new Array(cols)
for (var c = 0; c < cols; c++) {
mr[c] = v[(r * cols) + c]
}
}
return m
}
M.eig = function (m) {
var E = N.eig(m)
return {lambda: E.lambda.x, E: E.E.x}
}
M.tr = M.transpose = function (m) {
var r = []
var rows = m.length
var cols = m[0].length
for (var j = 0; j < cols; j++) {
var rj = r[j] = []
for (var i = 0; i < rows; i++) {
rj[i] = m[i][j]
}
}
return r
}
M.dot = function (a, b, isComplex = false) {
var arows = a.length
var bcols = b[0].length
var r = []
var bt = M.tr(b)
for (var i = 0; i < arows; i++) {
var ri = r[i] = []
for (var j = 0; j < bcols; j++) {
ri.push(j6.V.dot(a[i], bt[j], isComplex))
}
}
return r
}
M.isMatrix = function (m) {
return (m instanceof Array && m[0] instanceof Array)
}
M.diag = function (v) {
var rows = v.length
var r = M.new(rows, rows)
for (var i = 0; i < rows; i++) {
r[i][i] = v[i]
}
return r
}
M.identity = function (n) {
return M.diag(j6.T.repeat([n], () => 1))
}
M.inv = function (m0) {
var s = j6.T.dim(m0), abs = Math.abs, m = s[0], n = s[1]
var A = j6.clone(m0), Ai, Aj
var I = M.identity(m), Ii, Ij
var i, j, k, x
for (j = 0; j < n; ++j) {
var i0 = -1
var v0 = -1
for (i = j; i !== m; ++i) {
k = abs(A[i][j])
if (k > v0) { i0 = i; v0 = k }
}
Aj = A[i0]; A[i0] = A[j]; A[j] = Aj
Ij = I[i0]; I[i0] = I[j]; I[j] = Ij
x = Aj[j]
for (k = j; k !== n; ++k) Aj[k] /= x
for (k = n - 1; k !== -1; --k) Ij[k] /= x
for (i = m - 1; i !== -1; --i) {
if (i !== j) {
Ai = A[i]
Ii = I[i]
x = Ai[j]
for (k = j + 1; k !== n; ++k) Ai[k] -= Aj[k] * x
for (k = n - 1; k > 0; --k) { Ii[k] -= Ij[k] * x; --k; Ii[k] -= Ij[k] * x }
if (k === 0) Ii[0] -= Ij[0] * x
}
}
}
return I
}
M.det = function (x) {
var s = j6.dim(x)
if (s.length !== 2 || s[0] !== s[1]) { throw new Error('numeric: det() only works on square matrices') }
var n = s[0], ret = 1, i, j, k, A = j6.clone(x), Aj, Ai, alpha, temp, k1
for (j = 0; j < n - 1; j++) {
k = j
for (i = j + 1; i < n; i++) { if (Math.abs(A[i][j]) > Math.abs(A[k][j])) { k = i } }
if (k !== j) {
temp = A[k]; A[k] = A[j]; A[j] = temp
ret *= -1
}
Aj = A[j]
for (i = j + 1; i < n; i++) {
Ai = A[i]
alpha = Ai[j] / Aj[j]
for (k = j + 1; k < n - 1; k += 2) {
k1 = k + 1
Ai[k] -= Aj[k] * alpha
Ai[k1] -= Aj[k1] * alpha
}
if (k !== n) { Ai[k] -= Aj[k] * alpha }
}
if (Aj[j] === 0) { return 0 }
ret *= Aj[j]
}
return ret * A[j][j]
}
}