kriging克里金插值以及前端渲染jS代码部分解释

本文探讨了kriging克里金插值方法,并详细解释了其在前端JavaScript实现的关键代码,主要集中在kriging-original.js文件中的功能实现。
摘要由CSDN通过智能技术生成

.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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值