急求二维矩阵三次样条插值的程序,要C或C++语言。望有注释!谢谢! 邮箱[email protected]

希望是matlab中的interp2函数的C++代码实现!mode为spline.

第1个回答  2011-06-07
/*********************下面程序是C语言程序(标准C)******************/
/* 计算给定M0,Mn值的三次样条插值多项式 */
/*给定离散点(1.1,0.4),(1.2,0.8),(1.4,1.65),(1.5,1.8),M0=Mn=0,*/
/*用M关系式构造三次样条插值多项式S(x),计算S(1.25)。 */
/*************************************************************/
#include <stdio.h>
#define Max_N 20

main()
{int i,k,n;
double h[Max_N+1],b[Max_N+1],c[Max_N+1],d[Max_N+1],M[Max_N+1];
double u[Max_N+1],v[Max_N+1],yy[Max_N+1],x[Max_N+1],y[Max_N+1];
double xx,p,q,S;
printf("\nPlease input n value:"); /*输入插值点数n*/
do
{ scanf("%d",&n);
if(n>Max_N)
printf("\nplease re-input n value:");
}
while(n>Max_N||n<=0);
printf("Input x[i],i=0,...%d:\n",n-1);
for(i=0;i<n;i++) scanf("%lf",&x[i]);
printf("Input y[i],i=0,...%d:\n",n-1);
for(i=0;i<n;i++) scanf("%lf",&y[i]);
printf("\nInput the M0,Mn value:");
scanf("%lf%lf",&M[0],&M[n]);
printf("\nInput the x value:"); /*输入计算三次样条插值函数的x值*/
scanf("%lf",&xx);
if((xx>x[n-1])||(xx<x[0]))
{printf("Please input a number between %f and %f.\n",x[0],x[n-1]);
return;
}
/*计算M关系式中各参数的值*/
h[0]=x[1]-x[0];
for(i=1;i<n;i++)
{h[i]=x[i+1]-x[i];
b[i]=h[i]/(h[i]+h[i-1]);
c[i]=1-b[i];
d[i]=6*((y[i+1]-y[i])/h[i]-(y[i]-y[i-1])/h[i-1])/(h[i]+h[i-1]);
}
/*用追赶法计算Mi,i=1,...,n-1*/
d[1]-=c[1]*M[0];
d[n-1]-=b[n-1]*M[n];
b[n-1]=0; c[1]=0; v[0]=0;
for(i=1;i<n;i++)
{u[i]=2-c[i]*v[i-1];
v[i]=b[i]/u[i];
yy[i]=(d[i]-c[i]*y[i-1])/u[i];
}
for(i=1;i<n;i++)
{M[n-i]=yy[n-i]-v[n-i]*M[n-i+1];
}
/*计算三次样条插值函数在x处的值*/
k=0;
while(xx>=x[k]) k++;
k=k-1;
p=x[k+1]-xx;
q=xx-x[k];
S=(p*p*p*M[k]+q*q*q*M[k+1])/(6*h[k])+(p*y[k]+q*y[k+1])/h[k]-h[k]*(p*M[k]+q*M[k+1])/6;
printf("S(%f)=%f\n",xx,S); /*输出*/
getch();
}
/*----------------------------------- End of file ------------------------------------*/
/*程序输入输出:
Please input n value:4
Input x[i],i=0,...3:
1.1 1.2 1.4 1.5
Input y[i],i=0,...3:
0.4 0.8 1.65 1.8
Input the M0,Mn value: 0 0
Input the x value:1.25
S(1.250000)=1.033171
*/追问

M0,Mn值在MATLAB中的取值是多少呢?这代表什么?
我就是想要matlab中Interp2函数的itsmethod为‘spline’的时候的插值情况,但是这个我就有点不懂了...

追答

这个是C语言程序,在Tc2.0中调试通过。而不是Matlab程序

追问

我知道...但是我想知道具体的含义...M0,Mn值在MATLAB中的取值是多少呢?这代表什么?如果我是给定一个图像在每两点之间插一个值应该怎么算呢?

追答

你还是找个三次样条插值了解一下吧

本回答被网友采纳
第2个回答  2011-06-11
function x = doublem(a)
[height,width] = size(a);
temp = uint8(zeros(height*2,width*2));
for i =height*2:-2:1
for j =1:2:width*2
temp(i,j) =a(i/2,(j+1)/2);
end
end
for i =height*2:-2:1 %列转换
for j =2:2:width*2-1 %512*511
temp(i,j) =(temp(i,j-1)/2+temp(i,j+1)/2);
end
end
for j =1:1:width*2-1 %行转换
for i =height*2-1:-2:2
temp(i,j) =(temp(i-1,j)/2+temp(i+1,j)/2);
end
end
x = temp;
return;