@webarkit/jsfeat-next
Version:
Typescript version of jsfeat for WebARKit
305 lines (283 loc) • 8.24 kB
text/typescript
import { matrix_t } from "../matrix_t/matrix_t";
export default class matmath {
constructor() {}
identity(M: matrix_t, value: number): void {
if (typeof value === "undefined") {
value = 1;
}
const src = M.data;
const rows = M.rows,
cols = M.cols,
cols_1 = (cols + 1) | 0;
let len = rows * cols;
let k = len;
while (--len >= 0) src[len] = 0.0;
len = k;
k = 0;
while (k < len) {
src[k] = value;
k = k + cols_1;
}
}
transpose(At: matrix_t, A: matrix_t): void {
let i = 0,
j = 0,
nrows = A.rows,
ncols = A.cols;
let Ai = 0,
Ati = 0,
pAt = 0;
const ad = A.data,
atd = At.data;
for (; i < nrows; Ati += 1, Ai += ncols, i++) {
pAt = Ati;
for (j = 0; j < ncols; pAt += nrows, j++) atd[pAt] = ad[Ai + j];
}
}
// C = A * B
multiply(C: matrix_t, A: matrix_t, B: matrix_t): void {
let i = 0,
j = 0,
k = 0;
let Ap = 0,
pA = 0,
pB = 0,
p_B = 0,
Cp = 0;
const ncols = A.cols,
nrows = A.rows,
mcols = B.cols;
const ad = A.data,
bd = B.data,
cd = C.data;
let sum = 0.0;
for (; i < nrows; Ap += ncols, i++) {
for (p_B = 0, j = 0; j < mcols; Cp++, p_B++, j++) {
pB = p_B;
pA = Ap;
sum = 0.0;
for (k = 0; k < ncols; pA++, pB += mcols, k++) {
sum += ad[pA] * bd[pB];
}
cd[Cp] = sum;
}
}
}
// C = A * B'
multiply_ABt(C: matrix_t, A: matrix_t, B: matrix_t): void {
let i = 0,
j = 0,
k = 0;
let Ap = 0,
pA = 0,
pB = 0,
Cp = 0;
const ncols = A.cols,
nrows = A.rows,
mrows = B.rows;
const ad = A.data,
bd = B.data,
cd = C.data;
let sum = 0.0;
for (; i < nrows; Ap += ncols, i++) {
for (pB = 0, j = 0; j < mrows; Cp++, j++) {
pA = Ap;
sum = 0.0;
for (k = 0; k < ncols; pA++, pB++, k++) {
sum += ad[pA] * bd[pB];
}
cd[Cp] = sum;
}
}
}
// C = A' * B
multiply_AtB(C: matrix_t, A: matrix_t, B: matrix_t): void {
let i = 0,
j = 0,
k = 0;
let Ap = 0,
pA = 0,
pB = 0,
p_B = 0,
Cp = 0;
const ncols = A.cols,
nrows = A.rows,
mcols = B.cols;
const ad = A.data,
bd = B.data,
cd = C.data;
let sum = 0.0;
for (; i < ncols; Ap++, i++) {
for (p_B = 0, j = 0; j < mcols; Cp++, p_B++, j++) {
pB = p_B;
pA = Ap;
sum = 0.0;
for (k = 0; k < nrows; pA += ncols, pB += mcols, k++) {
sum += ad[pA] * bd[pB];
}
cd[Cp] = sum;
}
}
}
// C = A * A'
multiply_AAt(C: matrix_t, A: matrix_t): void {
let i = 0,
j = 0,
k = 0;
let pCdiag = 0,
p_A = 0,
pA = 0,
pB = 0,
pC = 0,
pCt = 0;
const ncols = A.cols,
nrows = A.rows;
const ad = A.data,
cd = C.data;
let sum = 0.0;
for (; i < nrows; pCdiag += nrows + 1, p_A = pA, i++) {
pC = pCdiag;
pCt = pCdiag;
pB = p_A;
for (j = i; j < nrows; pC++, pCt += nrows, j++) {
pA = p_A;
sum = 0.0;
for (k = 0; k < ncols; k++) {
sum += ad[pA++] * ad[pB++];
}
cd[pC] = sum;
cd[pCt] = sum;
}
}
}
// C = A' * A
multiply_AtA(C: matrix_t, A: matrix_t): void {
let i = 0,
j = 0,
k = 0;
let p_A = 0,
pA = 0,
pB = 0,
p_C = 0,
pC = 0,
p_CC = 0;
const ncols = A.cols,
nrows = A.rows;
const ad = A.data,
cd = C.data;
let sum = 0.0;
for (; i < ncols; p_C += ncols, i++) {
p_A = i;
p_CC = p_C + i;
pC = p_CC;
for (j = i; j < ncols; pC++, p_CC += ncols, j++) {
pA = p_A;
pB = j;
sum = 0.0;
for (k = 0; k < nrows; pA += ncols, pB += ncols, k++) {
sum += ad[pA] * ad[pB];
}
cd[pC] = sum;
cd[p_CC] = sum;
}
}
}
// various small matrix operations
identity_3x3(M: matrix_t, value: number) {
if (typeof value === "undefined") {
value = 1;
}
const dt = M.data;
dt[0] = dt[4] = dt[8] = value;
dt[1] = dt[2] = dt[3] = 0;
dt[5] = dt[6] = dt[7] = 0;
}
invert_3x3(from: matrix_t, to: matrix_t): void {
const A = from.data,
invA = to.data;
const t1 = A[4];
const t2 = A[8];
const t4 = A[5];
const t5 = A[7];
const t8 = A[0];
const t9 = t8 * t1;
const t11 = t8 * t4;
const t13 = A[3];
const t14 = A[1];
const t15 = t13 * t14;
const t17 = A[2];
const t18 = t13 * t17;
const t20 = A[6];
const t21 = t20 * t14;
const t23 = t20 * t17;
const t26 = 1.0 / (t9 * t2 - t11 * t5 - t15 * t2 + t18 * t5 + t21 * t4 - t23 * t1);
invA[0] = (t1 * t2 - t4 * t5) * t26;
invA[1] = -(t14 * t2 - t17 * t5) * t26;
invA[2] = -(-t14 * t4 + t17 * t1) * t26;
invA[3] = -(t13 * t2 - t4 * t20) * t26;
invA[4] = (t8 * t2 - t23) * t26;
invA[5] = -(t11 - t18) * t26;
invA[6] = -(-t13 * t5 + t1 * t20) * t26;
invA[7] = -(t8 * t5 - t21) * t26;
invA[8] = (t9 - t15) * t26;
}
// C = A * B
multiply_3x3(C: matrix_t, A: matrix_t, B: matrix_t): void {
const Cd = C.data,
Ad = A.data,
Bd = B.data;
const m1_0 = Ad[0],
m1_1 = Ad[1],
m1_2 = Ad[2];
const m1_3 = Ad[3],
m1_4 = Ad[4],
m1_5 = Ad[5];
const m1_6 = Ad[6],
m1_7 = Ad[7],
m1_8 = Ad[8];
const m2_0 = Bd[0],
m2_1 = Bd[1],
m2_2 = Bd[2];
const m2_3 = Bd[3],
m2_4 = Bd[4],
m2_5 = Bd[5];
const m2_6 = Bd[6],
m2_7 = Bd[7],
m2_8 = Bd[8];
Cd[0] = m1_0 * m2_0 + m1_1 * m2_3 + m1_2 * m2_6;
Cd[1] = m1_0 * m2_1 + m1_1 * m2_4 + m1_2 * m2_7;
Cd[2] = m1_0 * m2_2 + m1_1 * m2_5 + m1_2 * m2_8;
Cd[3] = m1_3 * m2_0 + m1_4 * m2_3 + m1_5 * m2_6;
Cd[4] = m1_3 * m2_1 + m1_4 * m2_4 + m1_5 * m2_7;
Cd[5] = m1_3 * m2_2 + m1_4 * m2_5 + m1_5 * m2_8;
Cd[6] = m1_6 * m2_0 + m1_7 * m2_3 + m1_8 * m2_6;
Cd[7] = m1_6 * m2_1 + m1_7 * m2_4 + m1_8 * m2_7;
Cd[8] = m1_6 * m2_2 + m1_7 * m2_5 + m1_8 * m2_8;
}
mat3x3_determinant(M: matrix_t): number {
const md = M.data;
return (
md[0] * md[4] * md[8] -
md[0] * md[5] * md[7] -
md[3] * md[1] * md[8] +
md[3] * md[2] * md[7] +
md[6] * md[1] * md[5] -
md[6] * md[2] * md[4]
);
}
determinant_3x3(
M11: number,
M12: number,
M13: number,
M21: number,
M22: number,
M23: number,
M31: number,
M32: number,
M33: number
): number {
return (
M11 * M22 * M33 - M11 * M23 * M32 - M21 * M12 * M33 + M21 * M13 * M32 + M31 * M12 * M23 - M31 * M13 * M22
);
}
}