cholesky
This commit is contained in:
parent
358ef7e19f
commit
374fa36548
@ -12,13 +12,13 @@ namespace matrix {
|
|||||||
private _cols: number;
|
private _cols: number;
|
||||||
private _values: number[];
|
private _values: number[];
|
||||||
|
|
||||||
constructor(rows: number, cols: number, values: number[] = []) {
|
constructor(rows: number, cols: number, values: number[] = undefined) {
|
||||||
pre(rows > 0);
|
pre(rows > 0);
|
||||||
pre(cols > 0);
|
pre(cols > 0);
|
||||||
this._rows = rows;
|
this._rows = rows;
|
||||||
this._cols = cols;
|
this._cols = cols;
|
||||||
this._values = values || [];
|
|
||||||
const n = this._rows * this._cols;
|
const n = this._rows * this._cols;
|
||||||
|
this._values = values || [];
|
||||||
// fill gaps
|
// fill gaps
|
||||||
while (this._values.length < n)
|
while (this._values.length < n)
|
||||||
this._values.push(0);
|
this._values.push(0);
|
||||||
@ -136,5 +136,35 @@ namespace matrix {
|
|||||||
}
|
}
|
||||||
return R;
|
return R;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clones the matrix
|
||||||
|
*/
|
||||||
|
dup(): Matrix {
|
||||||
|
const r = new Matrix(this._rows, this._cols, this._values.slice(0));
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Performs a Cholesky factorized for a symmetric and positive definite
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
cholesky(): Matrix {
|
||||||
|
pre(this._rows == this._cols);
|
||||||
|
const l = this.dup();
|
||||||
|
const n = this._rows;
|
||||||
|
const L = l._values;
|
||||||
|
|
||||||
|
for (let j = 0; j < n; j++) {
|
||||||
|
const jj = L[j * n + j] = Math.sqrt(L[j * n + j]);
|
||||||
|
for (let i = j + 1; i < n; ++i)
|
||||||
|
L[i * n + j] /= jj;
|
||||||
|
for (let k = j + 1; k < n; k++)
|
||||||
|
for (let i = k; i < n; i++)
|
||||||
|
L[i * n + j] -= L[i * n + j] * L[k * n + j];
|
||||||
|
}
|
||||||
|
|
||||||
|
return l;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user