我正在尝试将下面的matlab / octave函数转换为C(常规方式 - 理解matlab函数并从头开始在C中编写代码)。它使用多项式拟合将数据拟合到高斯曲线。
function y=func(data)
N=128;
y1=gausswin(N,4);
x1=[0:1/N:1-1/N]';
P=polyfit(x1,y1,12);
y=polyval(P,data);
但是当我检查函数polyfit时,这看起来很多工作,因为它涉及到对更多八度音阶库函数的大量调用。它首先计算Vandermonde矩阵,然后对它进行一些QR分解,并计算向量的范数等...
任何指针都很有用。
答案 0 :(得分:1)
除了将这样的多项式拟合为高斯的实用价值之外,您还可以分析代码的行为:
N=128;
y1=gausswin(N,4);
x1=[0:1/N:1-1/N]';
P=polyfit(x1,y1,12);
此部分的输出将始终相同,因此您可以在MATLAB或Octave中执行此操作,只需提取多项式P
,以便在C代码中使用它作为常量。它不如在C中重写所有内容那么灵活,但它也更快。
否则,您可能需要查看BLAS:BLAS为用于线性代数的库定义了一个API,例如LAPACK(由MATLAB使用)。我怀疑很多这些库都会实现你需要的基本操作。
<强>加成强>: 如果您对数值计算没有什么经验,或者只是希望从您手中完成大量工作,您可能需要考虑Matlab Coder。