.html中的方法调用
//训练使用高斯过程与贝叶斯先验
let variogram=kriging.train(positions.map(pos=>pos[2]),positions.map(pos=>pos[0]),positions.map(pos=>pos[1]),params.krigingModel,params.krigingSigma2,params.krigingAlpha);
//网格矩阵或轮廓路径
let grid=kriging.grid(polygons,variogram,(extent[2]-extent[0])/1000);
//在DOM上绘图.
//Canvas是HTML5提供的一个标签,我们可以在这个盒子区域绘画
kriging.plot(canvas,grid,[extent[0],extent[2]],[extent[1],extent[3]],colors);
kriging-original.js文件中的部分代码解释
// Extend the Array class
// Array.prototype.max重写数组原型链
//表示取得最大值
Array.prototype.max = function() {
//apply()方法接受的是一个参数数组
//返回一个最大值的数组
return Math.max.apply(null, this);
};
//这里表示取得最小值
Array.prototype.min = function() {
//返回一个最小值
return Math.min.apply(null, this);
};
//这里表示算平均数
Array.prototype.mean = function() {
var i, sum;
for(i = 0, sum = 0; i < this.length; i++)
sum += this[i];
return sum / this.length;
};
Array.prototype.rep = function(n) {
//返回一个长度为n的数组,且每一个元素都被赋值成undefined
return Array.apply(null, new Array(n))
.map(Number.prototype.valueOf, this[0]);
//Number.prototype.valueOf()方法返回数值对象的原始值
};
Array.prototype.pip = function(x, y) {
var i, j, c = false;
for(i = 0, j = this.length - 1; i < this.length; j = i++) {
if(((this[i][1] > y) != (this[j][1] > y)) &&
(x < (this[j][0] - this[i][0]) * (y - this[i][1]) / (this[j][1] - this[i][1]) + this[i][0])) {
c = !c;
}
}
return c;
}
var kriging = function() {
var kriging = {
};
// Matrix algebra矩阵代数
kriging_matrix_diag = function(c, n) {
//新建一个n*n的矩阵
var i, Z = [0].rep(n * n);
//循环赋值c给Z矩阵的每一元素
for(i = 0; i < n; i++) Z[i * n + i] = c;
return Z;
};
//将这个矩阵变为转置阵,也就是将元素颠倒顺序
kriging_matrix_transpose = function(X, n, m) {
var i, j, Z = Array(m * n);
for(i = 0; i < n; i++)
for(j = 0; j < m; j++)
Z[j * n + i] = X[i * m + j];
return Z;
};
//再次改变数值,把c给每一个二维元素赋值
kriging_matrix_scale = function(X, c, n, m) {
var i, j;
for(i = 0; i < n; i++)
for(j = 0; j < m; j++)
X[i * m + j] *= c;
};
//添加的方法
kriging_matrix_add = function(X, Y, n, m) {
//新建一个m*n的矩阵Z
var i, j, Z = Array(n * m);
for(i = 0; i < n; i++)
for(j = 0; j < m; j++)
//将X和Y矩阵相加合并成一个矩阵
Z[i * m + j] = X[i * m + j] + Y[i * m + j];
//返回一个Z矩阵
return Z;
};
// Naive matrix multiplication
//简单的矩阵乘法,矩阵和矩阵的乘法
//也就是前一个矩阵中的行乘以后一个矩阵中的列
kriging_matrix_multiply = function(X, Y, n, m, p) {
var i, j, k, Z = Array(n * p);
for(i = 0; i < n; i++) {
for(j = 0; j < p; j++) {
Z[i * p + j] = 0;
for(k = 0; k < m; k++)
Z[i * p + j] += X[i * m + k] * Y[k * p + j];
}
}
return Z;
};
// Cholesky decomposition
//柯列斯基分解,这是一种将正定矩阵分解为上三角矩阵和下三角矩阵的方法,
//在优化矩阵计算的时候会用到的一种技巧
//也就是,下面左边为下三角,右边为上三角
//100000 123456
//120000 023456
//123000 003456
//123400 000456
//123450 000056
//123456 000006
kriging_matrix_chol = function(X, n) {
var i, j, k, sum, p = Array(n);
for(i = 0; i < n; i++) p[i] = X[i * n + i];
for(i = 0; i < n; i++) {
for(j = 0; j < i; j++)
p[i] -= X[i * n + j] * X[i * n + j];
if(p[i] <= 0) return false;
p[i] = Math.sqrt(p[i]);
for(j = i + 1; j < n; j++) {
for(k = 0; k < i; k++)
X[j * n + i] -= X[j * n + k