Matlab之ineterp1插值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
%一维插值

x = 0 : pi/4 : 2 * pi; %x的样本值
y = sin(x); %y的样本值
xx = 0 : 0.5 : 2 * pi; %目标的x值
%分段线性插值(默认)
y1 = interp1(x,y,xx);
subplot(2,2,1);plot(x,y,'o',xx,y1,'r');
title('分段线性插值')

%临近插值
y2 = interp1(x,y,xx,'nearnest');
subplot(2,2,2);plot(x,y,'o',xx,y2,'r');
title('邻近插值')

%球面线性插值
y3 = interp1(x,y,xx,'spline');
subplot(2,2,3);plot(x,y,'o',xx,y3,'r');
title('球面线性插值')

%三次多项式插值
y4 = interp1(x,y,xx,'PCHIP');
subplot(2,2,4);plot(x,y,'o',xx,y4,'r');
title('三次多项式插值')

输出结果

ans


Matlab之二维插值:估测海底某曲面地形
1
2
3
4
5
6
7
8
9
10
% 2维插值示例:估测海底某曲面地形
x = [129,140,103.5,88,185.5,195,105,157.5,107.5,77,81,162,162,117.5];
y = [7.5,141.5,23,147,22.5,137.5,85.5,-6.5,-81,3,56.5,-66.5,84,-33.5];
z = -[4,8,6,8,6,8,8,9,9,8,8,0,4,9];
xmm = minmax(x);
ymm = minmax(y);
xi = xmm(1):2.5:xmm(2);
yi = ymm(1):2.5:ymm(2);
z_interp = griddata(x,y,z,xi,yi','V4'); %griddata插值同interp2,但是对数据要求不严格
surf(xi,yi,z_interp);

输出结果

ans

ans

PS:深度大于0的部分应手动舍弃,边值区域的二维插值会遇到问题。


Java自增自减运算符天坑笔试题

问:下面程序运行的结果是什么?

1
2
3
4
int count = 0;
for(int i = 0; i < 100; i++)
count = count++;
System.out.println("count = " + count);

答:count = 0

首先 count++ 是一个有返回值的表达式,返回值是 count 自加前面的值,java 对自加处理的流程是先把 count 的值(不是引用),拷贝到一个临时变量区,然后对 count 变量加 1,接着返回临时变量区的值。

所以上面代码中第一次循环执行的步骤是 JVM 把 count 的值(0)拷贝到临时变量区,然后 count 值加 1,这时 count 的值是 1,接着返回临时变量区的值(值还是 0),最后赋值给 count,此时 count 值被重置成 0。所以上面代码语句,count = count++可以按照如下代码来理解:

1
2
3
4
5
int autoAdd(int count) {
int temp = count;
count = coutn + 1;
return temp;
}

第一次循环后 count 的值还是 0,其他 99 次的循环也是一样,最终导致 count 的值始终没变,任然保持最初的状态,如果想要打印 100,则把语句count = count++改为count++即可。不过这个问题在不同的语言环境中是不一样的,在 c++ 中count = count++与count++是等效的,但在 Java 中是不等效的。