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

时间:2014-06-30 16:03:30

标签: c# matlab code-conversion

我正在使用一个使用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];
}

2 个答案:

答案 0 :(得分:0)

我能看到的唯一区别是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。

答案 1 :(得分:0)

哔哔你用Chebyshev多项式拟合数据是什么?使用傅立叶级数,你已经写出了方程式并测试了每个人的满意度。并且该等式与曲线有界,因此您不必担心在测试数据范围之外的不连续性。嘿,我有个好主意......我会这样做。