我正在尝试将一些matlab代码转换为python并运行到matlab的mkpp函数中。我在python中使用scipy阅读了很多不同的插值内容,但是我无法理解如何模仿matlab代码的功能。我尝试在scipy中使用interpolate.PiecewisePolynomial,但它似乎没有采用相同的参数,在matlab中是断点和系数。 matlab实际上有什么来源吗?如何在python中模仿mkpp的功能?
编辑: 所以从下面的评论中,是的,我已经尝试过查看mkpp文件,
if nargin==2, d = 1; else d = d(:).'; end
dlk=numel(coefs); l=length(breaks)-1; dl=prod(d)*l; k=fix(dlk/dl+100*eps);
if (k<=0)||(dl*k~=dlk)
error(message('MATLAB:mkpp:PPNumberMismatchCoeffs',...
int2str(l),int2str(d),int2str(dlk)))
end
pp.form = 'pp';
pp.breaks = reshape(breaks,1,l+1);
pp.coefs = reshape(coefs,dl,k);
pp.pieces = l;
pp.order = k;
pp.dim = d;
文件说的是什么,我找不到pp的任何文件,所以它似乎没用。
我已经读完了这个:Can someone explain the behavior of the functions mkpp and ppval?但是,它仍然没有解释matlab在幕后做什么,它只是解释它与常规多项式不同。
我甚至开始弄明白的问题是我为scipy找到的所有内容都与mkpp有不同的参数。我已经编写了python代码来创建coefs和break,但scipy文档http://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.PiecewisePolynomial.html#scipy.interpolate.PiecewisePolynomial甚至没有以相同的方式引用变量,这使得它非常混乱。
如果有人可以帮助解析这个术语是什么意思
,那就太好了答案 0 :(得分:1)
对于任何有兴趣的人,这是我的困惑,这就是我现在理解的方式。 pp实际上不是一个函数,而是对定义多项式的结构的调用。 mkpp只是创建多项式的组件,然后可以与ppval或样条或任何其他分析方法一起使用。为了模仿这个,我创建了以下代码,这是一个正在进行的工作,但应该对它如何工作提出一个好主意:
首先,我使用一个类来定义多项式
class PiecePoly():
"""
A class to mimick the MATLAB struct piecewise polynomial (pp)
"""
def __init__(self):
form = 'pp'
breaks = []
coefs = []
pieces = 0
order = 0
dim = 0
然后函数mkpp是:
def mkpp(breaks,coefs,*args):
"""
Takes in the breaks, coefs, and optionally (d) then creates a pp from the
PiecePoly class and constructs the polynomial
Returns: the constructed polynomial
"""
if len(args)==1:
d = np.transpose(args[0])
else:
d = 1
sum=0
try:
#Just make sure coefs is not a 4D matrix
for i in range(len(coefs)):
for j in range(len(coefs[i])):
sum = sum+len(coefs[i][j])
except:
#First try to count a 2D coefs array this should be the one that works
try:
for i in range(len(coefs)):
sum = sum+len(coefs[i])
#Coefs must be 1 dimensional
except:
sum = len(coefs)
dlk = sum
l = len(breaks)-1
try:
if len(d) > 1:
prod = 0
for i in range(len(d)):
prod = prod*d[i]
dl = prod*l
else:
dl = d*l
except:
dl = d*l
k = dlk/dl+100*(math.pow(2,-52))
if k<0:
k = math.ceil(k)
else:
k = math.floor(k)
if k<=0 or (dl*k!=dlk):
print "ERROR: MISMATCH PP AND COEF"
return None
pp = PiecePoly()
pp.form = 'pp'
pp.breaks = np.reshape(breaks,1,l+1)
pp.coefs = np.reshape(coefs,dl,k)
pp.order = k
pp.dim = d
return pp