【问题标题】:MATLAB angle() to C# conversionMATLAB angle() 到 C# 的转换
【发布时间】:2016-08-21 09:33:45
【问题描述】:

我想转移到 C#,这是一个计算来自 MATLAB 的表达式的相量角的函数,angle()。我发现 angle(x+yi)=atan2(y,x) 但我的问题来了,我有一个 平方根 取决于我给它的值是 positive 还是 negative。但是,在 MATLAB 中,如果 sqrt 函数得到一个负数,它会返回一个 imaginary,这与 C# 中它返回 NaN 不同。

那么,我怎样才能让两个代码给出相同的结果呢?

即 MATLAB:

angle(a*1i-sqrt(expression))

C#:

Mathf.Atan2(a,-sqrt(expression))(我做了什么,我认为是错误的)

【问题讨论】:

  • 帮我取某人的标题
  • 取表达式的绝对值。记得从初中CAST。余弦在第四象限为正,所有函数在第一象限为正,正弦在第二象限为正,正切在第三象限。
  • @jdweng 我认为不会这样做,在 matlab 中,sqrt(negatives) 给出了一个用于计算的虚数,通过使用 abs 值,我正在更改结果,使得 c# 不会表现为matlab
  • 只要你意识到i轴是sqrt -1,ax+by和ax+bi真的没有区别。数学是一样的。
  • @jdweng 好吧,我不完全明白你想告诉我什么,但是为了测试我移动了 sqrt(expression) 而 expression 有一个负值,这意味着 sqrt 返回一个虚构的,所以 c#对应于:Mathf.Atan2(a-sqrt(abs(expression)),0)(其结果始终为 pi/2)并且 matlab 的结果对于相同的输入是相同的,所以我猜 c# 中的 sqrt 应该更改参数位置取决于表达式的符号,可能使用简单的 if 语句。我做了你告诉我的事情,我理解为:Mathf.Atan2(a,-sqrt(abs(expression))) 并没有产生相同的结果。

标签: c# matlab complex-numbers phase


【解决方案1】:

您可以做与 Matlab 相同的事情并使用复杂数学:

using System.Numerics;

public static class Foo
{
    public static double GetAngle(double a, double expression)
    {
        Complex cA = new Complex(0, a);
        Complex sqrt = Complex.Sqrt(expression);
        Complex result = cA - sqrt;
        return result.Phase;
    }
}

如果您不想这样做,您可以看到,如果expression 是负数,则sqrt(expression) 是(正)虚轴上的一个数字,这意味着a*i-sqrt(Expression) == (a-sqrt(abs(expression)))*i 的相位是 pi/ 2 或 3*pi/2:

public static class Foo
{
    public static double GetAngle(double a, double expression)
    {
        if (expression < 0.0)
        {
            double result = a - Math.Sqrt(-expression);
            if (result > 0.0)
                return Math.PI * 0.5;
            else if (result < 0.0)
                return Math.PI * 1.5;
            else
                return 0.0;
        }
        else
            return Math.Atan2(a, -Math.Sqrt(expression));
    }
}

【讨论】:

  • 是的,我喜欢这样,谢谢,我看到了复杂的结构,但我认为它会比您的示例中看起来更复杂,这就是我需要再次看到的,感谢您的时间
猜你喜欢
  • 2017-08-19
  • 2010-11-16
  • 1970-01-01
  • 2014-12-30
  • 1970-01-01
  • 2017-02-08
  • 1970-01-01
  • 2011-12-05
  • 1970-01-01
相关资源
最近更新 更多