标签: complex-numbers

如何使用C中的复数?

如何使用C中的复数?我看到有一个complex.h头文件,但它没有给我很多关于如何使用它的信息.如何以有效的方式访问实部和虚部?是否有本机功能来获取模块和阶段?

c complex-numbers

117
推荐指数
4
解决办法
16万
查看次数

python中的复数用法

我是一个数学新手.现在我正在深入研究Python数据类型.我无法理解如何使用复数.请给我举例说明Python中复数的用法.

python complex-numbers

96
推荐指数
2
解决办法
22万
查看次数

Numpy:从2个真实阵列创建一个复杂的数组?

我发誓这应该是那么容易......为什么不呢?:(

实际上,我想组合同一个数组的两个部分来组成一个复杂的数组:

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)

python arrays numpy complex-numbers

55
推荐指数
6
解决办法
8万
查看次数

如何对浮点数和复数进行近似结构模式匹配

我读过并理解浮点舍入问题,例如:

>>> 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

55
推荐指数
2
解决办法
3495
查看次数

为什么在 C++/Python/NumPy 中 log(inf + inf j) 等于 (inf + 0.785398 j)?

我一直在 C++ 和 numpy 中发现关于函数处理复杂无限数log的行为的奇怪行为。log具体来说,log(inf + inf * 1j)等于(inf + 0.785398j)我期望的值(inf + nan * 1j)

当取复数的对数时,实部是输入的绝对值的对数,虚部是输入的相位。返回 0.785398 作为 的虚部log(inf + inf * 1j)意味着它假设inf实部和虚部中的 s 具有相同的长度。这个假设似乎与其他计算不一致,例如 ,inf - inf == naninf / 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)

c++ python numpy infinity complex-numbers

55
推荐指数
3
解决办法
3943
查看次数

C复数和printf

如何打印(带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 printf complex-numbers

46
推荐指数
2
解决办法
3万
查看次数

为什么C++要求只为float,double或long double实例化复杂?

根据C++ ISO规范,§26.2/ 2:

将模板实例化为complexfloat(double或未long double指定)之外的任何类型的效果.

为什么标准作者会明确添加此限制?这使得它没有被指定,例如,如果你制造complex<int>或者complex<MyCustomFixedPointType>看起来像是人为限制会发生什么.

有这个限制的原因吗?如果要complex使用自己的自定义类型进行实例化,是否有解决方法?

我主要是问这个问题是因为早先的问题,其中OP对为什么abs给出奇怪的输出感到困惑complex<int>.也就是说,考虑到我们也可能想要用complex固定点类型,更高精度的实数等来制作数字,这仍然没有意义.

c++ math language-design complex-numbers

39
推荐指数
2
解决办法
1891
查看次数

Cython中的复数

在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)

c python numpy cython complex-numbers

39
推荐指数
1
解决办法
3954
查看次数

Tcl中的复数运算?

是否有一个等效的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)

所以基本上我要求这个实用程序的强大版本.

parsing expression tcl complex-numbers

33
推荐指数
1
解决办法
876
查看次数

分析高斯整数的好方法是什么?

我已经有了素数因子化(对于整数),但现在我想用高斯整数来实现它,但我该怎么做呢?谢谢!

algorithm math complex-numbers prime-factoring number-theory

31
推荐指数
1
解决办法
2万
查看次数