@thi.ng/sparse
Version:
Sparse vector & matrix implementations
82 lines (81 loc) • 1.95 kB
JavaScript
const compress = (m, n, dense) => {
const major = [0];
const minor = [];
const data = [];
for (let i = 0, col = 0; col < n; col++) {
let nnz = 0;
for (let row = 0; row < m; i++, row++) {
if (dense[i] !== 0) {
data.push(dense[i]);
minor.push(row);
nnz++;
}
}
major.push(major[major.length - 1] + nnz);
}
return [major, minor, data];
};
const diag = (vals) => {
const n = vals.length;
const major = [];
const minor = [];
for (let i = 0; i < n; i++) {
major.push(i);
minor.push(i);
}
major.push(n);
return [major, minor];
};
const at = (id1, id2, major, minor, data) => {
const ii = major[id1 + 1];
for (let i = major[id1]; i < ii; i++) {
if (minor[i] === id2) {
return data[i];
}
}
return 0;
};
const setAt = (id1, id2, id1max, val, major, minor, data, compact = true) => {
const notZero = val !== 0;
const ii = major[id1 + 1];
for (let i = major[id1]; i < ii; i++) {
const j = minor[i];
if (j === id2) {
if (notZero || !compact) {
data[i] = val;
} else {
remove(id1, id1max, i, major, minor, data);
}
return [major, minor, data];
} else if (j > id2 && notZero) {
return insert(id1, id2, id1max, val, i, major, minor, data);
}
}
if (notZero) {
return insert(id1, id2, id1max, val, ii, major, minor, data);
}
return [major, minor, data];
};
const insert = (id1, id2, id1max, x, idx, major, minor, data) => {
data = data.slice(0, idx).concat(x, data.slice(idx));
minor = minor.slice(0, idx).concat(id2, minor.slice(idx));
for (let i = id1 + 1; i <= id1max; i++) {
major[i]++;
}
return [major, minor, data];
};
const remove = (id1, id1max, idx, major, minor, data) => {
data.splice(idx, 1);
minor.splice(idx, 1);
for (let i = id1 + 1; i <= id1max; i++) {
major[i]--;
}
};
export {
at,
compress,
diag,
insert,
remove,
setAt
};