如何使用C中的复数?我看到有一个complex.h头文件,但它没有给我很多关于如何使用它的信息.如何以有效的方式访问实部和虚部?是否有本机功能来获取模块和阶段?
我是一个数学新手.现在我正在深入研究Python数据类型.我无法理解如何使用复数.请给我举例说明Python中复数的用法.
我发誓这应该是那么容易......为什么不呢?:(
实际上,我想组合同一个数组的两个部分来组成一个复杂的数组:
Data[:,:,:,0] , Data[:,:,:,1]
Run Code Online (Sandbox Code Playgroud)
这些不起作用:
x = np.complex(Data[:,:,:,0], Data[:,:,:,1])
x = complex(Data[:,:,:,0], Data[:,:,:,1])
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?numpy不喜欢在复数上执行数组函数吗?这是错误:
TypeError: only length-1 arrays can be converted to Python scalars
Run Code Online (Sandbox Code Playgroud) 我读过并理解浮点舍入问题,例如:
>>> sum([0.1] * 10) == 1.0
False
>>> 1.1 + 2.2 == 3.3
False
>>> sin(radians(45)) == sqrt(2) / 2
False
Run Code Online (Sandbox Code Playgroud)
我还知道如何使用math.isclose()和cmath.isclose()解决这些问题。
问题是如何将这些解决方法应用到 Python 的 match/case 语句中。我希望这个工作:
match 1.1 + 2.2:
case 3.3:
print('hit!') # currently, this doesn't match
Run Code Online (Sandbox Code Playgroud) python floating-point complex-numbers approximate structural-pattern-matching
我一直在 C++ 和 numpy 中发现关于函数处理复杂无限数log的行为的奇怪行为。log具体来说,log(inf + inf * 1j)等于(inf + 0.785398j)我期望的值(inf + nan * 1j)。
当取复数的对数时,实部是输入的绝对值的对数,虚部是输入的相位。返回 0.785398 作为 的虚部log(inf + inf * 1j)意味着它假设inf实部和虚部中的 s 具有相同的长度。这个假设似乎与其他计算不一致,例如 ,inf - inf == nan它inf / inf == nan假设 2 infs 不一定具有相同的值。
为什么假设log(inf + inf * 1j)不同?
重现 C++ 代码:
#include <complex>
#include <limits>
#include <iostream>
int main() {
double inf = std::numeric_limits<double>::infinity();
std::complex<double> …Run Code Online (Sandbox Code Playgroud) 如何打印(带printf)复数?例如,如果我有这个代码:
#include <stdio.h>
#include <complex.h>
int main(void)
{
double complex dc1 = 3 + 2*I;
double complex dc2 = 4 + 5*I;
double complex result;
result = dc1 + dc2;
printf(" ??? \n", result);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
..我应该使用什么转换说明符(或其他东西)"???"
根据C++ ISO规范,§26.2/ 2:
将模板实例化为
complex除float(double或未long double指定)之外的任何类型的效果.
为什么标准作者会明确添加此限制?这使得它没有被指定,例如,如果你制造complex<int>或者complex<MyCustomFixedPointType>看起来像是人为限制会发生什么.
有这个限制的原因吗?如果要complex使用自己的自定义类型进行实例化,是否有解决方法?
我主要是问这个问题是因为早先的问题,其中OP对为什么abs给出奇怪的输出感到困惑complex<int>.也就是说,考虑到我们也可能想要用complex固定点类型,更高精度的实数等来制作数字,这仍然没有意义.
在Cython中处理复杂数字的正确方法是什么?
我想用dtype np.complex128的numpy.ndarray编写一个纯C循环.在Cython中,关联的C类型定义
Cython/Includes/numpy/__init__.pxd为
ctypedef double complex complex128_t
Run Code Online (Sandbox Code Playgroud)
所以看起来这只是一个简单的C双复合体.
但是,很容易获得奇怪的行为.特别是,有了这些定义
cimport numpy as np
import numpy as np
np.import_array()
cdef extern from "complex.h":
pass
cdef:
np.complex128_t varc128 = 1j
np.float64_t varf64 = 1.
double complex vardc = 1j
double vard = 1.
Run Code Online (Sandbox Code Playgroud)
这条线
varc128 = varc128 * varf64
Run Code Online (Sandbox Code Playgroud)
可以通过Cython编译,但gcc无法编译生成的C代码(错误是"testcplx.c:663:25:错误:声明说明符中的两个或更多数据类型",似乎是由于该行typedef npy_float64 _Complex __pyx_t_npy_float64_complex;).此错误已经报告(例如此处)但我没有找到任何好的解释和/或清洁解决方案.
没有包含complex.h,没有错误(我猜因为typedef那时不包括在内).
但是,仍然存在一个问题,因为在生成的html文件中cython -a testcplx.pyx,该行varc128 = varc128 * varf64是黄色的,这意味着它尚未被转换为纯C.相应的C代码是:
__pyx_t_2 = __Pyx_c_prod_npy_float64(__pyx_t_npy_float64_complex_from_parts(__Pyx_CREAL(__pyx_v_8testcplx_varc128), __Pyx_CIMAG(__pyx_v_8testcplx_varc128)), __pyx_t_npy_float64_complex_from_parts(__pyx_v_8testcplx_varf64, 0));
__pyx_v_8testcplx_varc128 …Run Code Online (Sandbox Code Playgroud) 是否有一个等效的expr命令适用于复数(代表两个双打的列表)?
该库提供了复数运算的函数,这似乎是定义所需cexpr函数的有用实用程序,但它不能很好地工作.
例如,它没有正确处理括号.
ParseExpressions::ParseExpr { (1) + ((2) + (3)) } { }
Run Code Online (Sandbox Code Playgroud)
回报
+ [+ 1 ((2)] (3))
Run Code Online (Sandbox Code Playgroud)
虽然它应该回来
+ [+ 1 2] 3
Run Code Online (Sandbox Code Playgroud)
还有ParseExpressions :: ParseExpr {{1 2} + {3 4}} {}
回报
+ 1 2 3 4
Run Code Online (Sandbox Code Playgroud)
虽然它应该回来
+ {1 2} {3 4}
Run Code Online (Sandbox Code Playgroud)
所以基本上我要求这个实用程序的强大版本.
我已经有了素数因子化(对于整数),但现在我想用高斯整数来实现它,但我该怎么做呢?谢谢!
algorithm math complex-numbers prime-factoring number-theory
complex-numbers ×10
python ×5
c ×3
numpy ×3
c++ ×2
math ×2
algorithm ×1
approximate ×1
arrays ×1
cython ×1
expression ×1
infinity ×1
parsing ×1
printf ×1
structural-pattern-matching ×1
tcl ×1