【问题标题】:Python complex numbers from C++ strange output来自 C++ 奇怪输出的 Python 复数
【发布时间】:2021-04-14 12:55:27
【问题描述】:

我正在将一些代码从 C++ 转换为 Python,而 Python 输出中的一些值是错误的。预期的输出是存储在数组中的数字对。在 python 中,我首先得到很多 1-0j 对,然后是好的。在 C++ 中,最大值约为 1.3,而在 Python 中则超过 9。如何修改我的 python 代码才能从 C++ 获取输出。

main func C++,我知道S什么都不做,但我以后会用它:

int X = 1000;
int N = X;

complex<double> S;

for (int n=0; n<X; n++)
{
    S = complex<double>(0,0);
    for (int x=0; x<X; x++)
    {
        double r = cos(((2*M_PI)/X)*n*x);
        double i = sin(((2*M_PI)/X)*n*x);
        complex<double> t (r, -i);
        cout << t << endl;
    }
}

Python:

import numpy as np
from math import pi
import sys
 
np.set_printoptions(threshold=sys.maxsize)

X = 1000
N = X
S = np.zeros(0, dtype = complex)
T = np.zeros(0, dtype = complex)

n = 0
x = 0
for n in range(0, 1000, 1):
     # S = np.append(S, np.complex(0 ,0)
  
    for x in range(0, 1000, 1):
        r = np.cos(((2*pi)/X)*n*x)
        i  = np.sin(((2*pi)/X)*n*x)
        T = np.append(T, np.complex(r, -i))
        print(T)
        print('\n')

【问题讨论】:

  • 你能把每段代码的输出部分贴出来吗?当我自己运行 python 代码时,我看到像 9.51056516e-01j 这样的值,它不是 9.5... 但实际上是 0.95...
  • 我同意@Kevin,我相信格式把你搞砸了。此代码不应输出大于 1.0 的值:abs(T)
  • 嗯,是的,我的错。和 '。' .但是你没有看到“1.00000000e + 00-0.j”?当我开始我的 Python 程序时,它一开始就向我展示了很多东西?
  • 因为当 n 为 0(前 1000 个值是正确的)时,您正在计算 cos(0)sin(0),这将为您提供一个复数 1 + 0i

标签: python c++ translate


【解决方案1】:

不清楚为什么您认为您的 Python 代码等同于您的 C++ 代码。 T = np.append(T, np.complex(r, -i)) 不等于 complex&lt;double&gt; t (r, -i);。产生相同输出的 C++ 的实际等效 Python 代码是:

from numpy import cos, sin, pi # could also import from math instead of numpy, might affect speed though
X = 1000

for n in range(X):
    for x in range(X):
        r = cos(((2*pi)/X)*n*x)
        i = sin(((2*pi)/X)*n*x)
        t = complex(r, -i)
        print(t)

我测试的方法是在两组代码中将X 设置为5 并比较输出。它们是相同的(Python 只是显示了更多的精度)。

【讨论】:

  • +1 这比我的要简单得多,但我还是决定发布我的代码,因为它创建了一个输出数组。
  • 谢谢,我会用的!
【解决方案2】:

这是我对 C++ 代码的转换。我维护了数组的创建,但预先分配了它们,而不是使用 np.append (当你已经定义了数组长度时会不必要地慢)。还为“打印”语句添加了格式。请注意,打印一百万个值需要很长时间,所以我建议注释掉打印行,或者将 X 的值减少到 50 或更少。

import numpy as np
import sys

np.set_printoptions(threshold=sys.maxsize)

X = 1000
N = X

S = np.zeros((N*X,), dtype=complex)
T = np.zeros((N*X,), dtype=complex)

k = 0

for n in range(0, N):
    # Not sure what you were trying to do with "S"
    for x in range(0, X):
        r = np.cos((2*np.pi/X)*n*x)
        i = np.sin((2*np.pi/X)*n*x)
        T[k] = np.complex(r, -i)
        print('{val:14.3f}'.format(val=T[k]))
        k += 1
    

【讨论】:

  • 非常感谢!
猜你喜欢
  • 1970-01-01
  • 2021-12-03
  • 2011-06-14
  • 1970-01-01
  • 2015-03-24
  • 1970-01-01
  • 1970-01-01
  • 2023-01-29
  • 1970-01-01
相关资源
最近更新 更多