得到不正确的数学值后,Matlab代码转换为c#

本文关键字:Matlab 代码 转换 不正确 | 更新日期: 2023-09-27 18:10:46

我使用的是使用TableCurve程序生成并用Matlab编写的方法。我正试图将该方法转换为c#在我的项目中使用,但它返回不正确的值。我想我已经把问题缩小到一个特定的地方,原始代码是

iv=1;
for j=1:1:tcnt
    for m=j:-1:1
      v(iv)=tx(m)*ty(j-m+1);
      iv=iv+1;
    end
end

,其中tx、ty和v是数字列表,iv是计数器。我把它翻译成

n = 0;
for (int j = 1; j <= tcnt; j++)
{
    for (int m = j; m >= 1; m--)
    {
        v[n] = tx[m - 1] * ty[j - m];
        n++;
    }
}

有人看到我的索引有问题吗?因为我没有。如果我的索引没有问题,我将编辑这个问题,试图找到实际的问题区域。

编辑

这是整个工作的Matlab代码(变量设置后)

 tx(1)=1.0;
 ty(1)=1.0;
 tx(2)=x;
 ty(2)=y;
 for j=2:1:tcnt-1
     tx(j+1)=2*x*tx(j)-tx(j-1);
     ty(j+1)=2*y*ty(j)-ty(j-1);
 end
 iv=1;
 for j=1:1:tcnt
     for m=j:-1:1
         v(iv)=tx(m)*ty(j-m+1);
         iv=iv+1;
     end
  end
  z=0.0;
  for j=1:1:order+1
      z = z + p(j)*v(j);
  end
这是我的c#代码
tx[0] = 1.0;
ty[0] = 1.0;
tx[1] = x;
ty[1] = y;
for (int j = 2; j <= tcnt; j++)
{
    tx[j] = 2 * x * tx[j - 1] - tx[j - 2];
    ty[j] = 2 * y * ty[j - 1] - ty[j - 2];
}
n = 0;
for (int j = 1; j < tcnt; ++j)
{
    for (int m = j; m >= 1; --m)
    {
        v[n] = tx[m] * ty[j - m + 1];
        n++;
    }
}
z = 0.0;
for (int j = 0; j <= order; j++)
{
    z += constantList[j] * v[j];
}

得到不正确的数学值后,Matlab代码转换为c#

哔哔你在用切比雪夫多项式拟合数据吗?使用傅里叶级数,你已经写出了方程并且测试了每个人都满意。方程是有界于曲线的所以你不用担心测试数据范围之外的不连续。嘿,我有个好主意…我会的

我能看到的唯一区别是matlab索引从1开始,而c#索引从0开始,所以以下应该是等效的:

iv=1;
for (int j = 1; j < tcnt; ++j) {
    for (int m = j; m >= 1; --m) {
        v[iv-1] = tx[m] * ty[j-m+1];
        iv++;
    }
}

另外,第一个matlab循环从2运行到tcnt - 1,而c#版本从2运行到tcnt。