Skip to content

Commit 4742617

Browse files
author
Kjerand Pedersen
committed
fixes and optimisations for release 0.2.2
1 parent 88bcf94 commit 4742617

File tree

13 files changed

+251
-173
lines changed

13 files changed

+251
-173
lines changed

package-lock.json

Lines changed: 16 additions & 16 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"private": false,
33
"name": "@kjerandp/linear-algebra",
4-
"version": "0.2.1",
4+
"version": "0.2.2",
55
"description": "Math library for doing basic linear algebra operations",
66
"repository": "https://github.com/kjerandp/linear-algebra",
77
"author": "Kjerand Pedersen",

src/array.js

Lines changed: 51 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,68 +1,3 @@
1-
export function createArray1d(values, columns, initValue) {
2-
if (values && values.length) {
3-
columns = columns > 0 ? columns : values.length;
4-
}
5-
if (columns < 1) throw Error('Columns not a number!');
6-
const arr = new Array(columns);
7-
let c = 0;
8-
if (values) {
9-
const itr = Math.min(values.length, columns);
10-
for (; c < itr; c++) {
11-
arr[c] = values[c];
12-
}
13-
}
14-
for (; c < columns; c++) {
15-
arr[c] = initValue;
16-
}
17-
return arr;
18-
}
19-
20-
export function createArray2d(values, columns, rows, initValue) {
21-
if (values && values.length) {
22-
rows = Math.ceil(values.length / columns);
23-
}
24-
if (Number.isFinite(values)) {
25-
rows = values;
26-
values = null;
27-
}
28-
if (columns < 1) throw Error('Columns not a number!');
29-
rows = rows || 1;
30-
const arr = new Array(rows);
31-
const len = rows * columns;
32-
let i = 0;
33-
let r = -1;
34-
if (values) {
35-
const itr = Math.min(len, values.length);
36-
for (; i < itr; i++) {
37-
const c = i % columns;
38-
if (c === 0) {
39-
r++;
40-
arr[r] = new Array(columns);
41-
}
42-
arr[r][c] = values[i];
43-
}
44-
}
45-
for (; i < len; i++) {
46-
const c = i % columns;
47-
if (c === 0) {
48-
r++;
49-
arr[r] = new Array(columns);
50-
}
51-
arr[r][c] = initValue;
52-
}
53-
54-
// for (let r = 0; r < arr.length; r++) {
55-
// arr[r] = new Array(columns);
56-
// for (let c = 0; c < columns; c++) {
57-
// arr[r][c] = values[i++];
58-
// }
59-
// for (let c = i; c < columns; c++) {
60-
// arr[r][c] = initValue;
61-
// }
62-
// }
63-
return arr;
64-
}
65-
661
export function assignTo(arr, cb) {
672
if (Array.isArray(arr[0])) {
683
for (let r = 0; r < arr.length; r++) {
@@ -80,13 +15,17 @@ export function assignTo(arr, cb) {
8015
export function copyTo(arr, values) {
8116
if (Array.isArray(arr[0])) {
8217
let i = 0;
83-
for (let r = 0; r < arr.length; r++) {
84-
for (let c = 0; c < arr[0].length && i < values.length; c++) {
18+
const ncols = arr[0].length;
19+
const nrows = arr.length;
20+
for (let r = 0; r < nrows; r++) {
21+
for (let c = 0; c < ncols; c++) {
22+
if (i >= values.length) return;
8523
arr[r][c] = values[i++];
8624
}
8725
}
8826
} else {
89-
for (let c = 0; c < arr.length && c < values.length; c++) {
27+
const l = Math.min(arr.length, values.length);
28+
for (let c = 0; c < l; c++) {
9029
arr[c] = values[c];
9130
}
9231
}
@@ -157,3 +96,47 @@ export const flatten = (inpArr) => {
15796
}
15897
return arr;
15998
};
99+
100+
export function createArray1d(values, columns, initValue) {
101+
if (values) {
102+
columns = columns > 0 ? columns : values.length;
103+
const arr = new Array(columns);
104+
for (let c = 0; c < arr.length; c++) {
105+
arr[c] = c < values.length ? values[c] : initValue;
106+
}
107+
return arr;
108+
}
109+
if (columns < 1) throw Error('Columns not a number!');
110+
111+
return new Array(columns).fill(initValue);
112+
}
113+
114+
export function createArray2d(values, columns, rows, initValue) {
115+
if (values) {
116+
if (values.length) {
117+
rows = Math.ceil(values.length / columns);
118+
} else if (Number.isFinite(values)) {
119+
rows = values;
120+
values = null;
121+
}
122+
} else {
123+
rows = rows || 1;
124+
}
125+
if (columns < 1) throw Error('Columns not a number!');
126+
const arr = new Array(rows);
127+
if (values) {
128+
let k = 0;
129+
for (let i = 0; i < arr.length; i++) {
130+
arr[i] = new Array(columns);
131+
for (let j = 0; j < columns; j++) {
132+
arr[i][j] = k < values.length ? values[k++] : initValue;
133+
}
134+
}
135+
} else {
136+
for (let i = 0; i < arr.length; i++) {
137+
arr[i] = new Array(columns);
138+
if (initValue !== undefined) arr[i].fill(initValue);
139+
}
140+
}
141+
return arr;
142+
}

src/functions.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import { flatten } from './array';
44
import op from './math';
55
import {
66
constantIterator,
7-
combinedIterator,
87
arrayIterator,
98
} from './utils';
109
import {
@@ -97,6 +96,16 @@ export function mix(a, b, t) {
9796
};
9897
while (itr());
9998

99+
// const va = standardizeArgument(a);
100+
// const vb = standardizeArgument(b);
101+
102+
// if (va.length !== vb.length)
103+
// throw Error('Values must have the same number of components!');
104+
105+
// const ts = standardizeArgument(t);
106+
107+
// const mixed = va.map((v, i) => op.mix(v, vb[i], i < ts.length ? ts[i] : ts[0]));
108+
100109
if (Array.isArray(a)) {
101110
return mixed;
102111
}
@@ -116,6 +125,9 @@ export function clamp(val, min = 0, max = 1) {
116125
clamped.push(op.clamp(v.value, min, max));
117126
v = itr.next();
118127
}
128+
// const arr = standardizeArgument(val);
129+
// const clamped = arr.map(v => op.clamp(v, min, max));
130+
119131
if (Array.isArray(val)) return clamped;
120132

121133
return val.clone().copyFrom(clamped);

src/math/determinant.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { ncols, clone, removeFrom } from '../array';
22

3-
export default op => function determinant(m) {
3+
function determinantRec(m, op) {
44
if (m.length === 1) return m[0][0];
55

66
let d = op.zero();
@@ -9,13 +9,15 @@ export default op => function determinant(m) {
99
const v = m[0][c];
1010
if (op.isZero(v)) continue;
1111
const sm = clone(m);
12-
removeFrom(sm, c + 1, 1);
13-
let cofactor = determinant(sm, op);
12+
removeFrom(sm, 1, c + 1);
13+
let cofactor = determinantRec(sm, op);
1414

1515
if (c % 2 === 1) {
1616
cofactor = op.negate(cofactor);
1717
}
1818
d = op.add(d, op.multiply(v, cofactor));
1919
}
2020
return d;
21-
};
21+
}
22+
23+
export default op => m => determinantRec(m._values, op);

src/math/inverse.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
import identityMatrixFactory from './identity';
2-
import { rows } from '../array';
32

43
export default (op) => {
54
const identityMatrix = identityMatrixFactory(op);
65
return (m) => {
7-
const dim = rows(m);
6+
const dim = m.length;
87
const r = identityMatrix(dim, op);
98

109
for (let i = 0; i < dim; i++) {

0 commit comments

Comments
 (0)