复数的实部和虚部

real and imaginary part of a complex number

本文关键字:虚部 实部      更新时间:2023-10-16

我有 2 个指针指向两个 20 个成员数组。我的数组包含复数。我想为这个复数逐个元素划分,这就是为什么我需要将数字分为实部和虚部。我尝试了以下代码,但它给出了错误。

    #include <complex>
    complex *a;
    complex *b;
    complex array1[20];
    complex array2[20];
    a = &array1;
    b = &array2;
    int i=0;
    for (i=0;i<=19;i++)
    {
    real_part_array1[i] = real(*a[i]);
    imag_part_array1[i] = imag(*a[i]);
    real_part_array2[i] = real(*b[i]);
    imag_part_array2[i] = imag(*b[i]); 
    }

我得到的第一个错误是;我试着把它写成

    #include <complex.h>

错误消息是"无法打开源文件复杂.h"。然后我删除了h,错误消失了。我遇到的第二个错误是 real() 和 imag()。错误消息是"标识符真实未定义"。

对于除法,我必须将它们分为实部和虚部,但我不知道如何解决这个问题。希望你们能帮到我。

  1. complex不是一个类型,它是一个类型模板。您需要将实部和虚部的类型指定为模板参数,例如 complex<double> .

  2. 类型模板complex以及函数realimag位于std命名空间中。

    关于complex<...>,你可以写std::complex<...>或使用命名空间std放置using std::complex; below your includes. (You could also write;但习惯它可能很危险。

    关于realimag,他们可以使用ADL(一个rgument dependent lookup:当他们的参数在std命名空间中时,函数名称也会在std中自动查找),因此您无需为这些函数指定命名空间。

  3. 在第 a = &array1; 行(以及另一个类似的行)中,您指向整个数组array1,这是一个指向数组的指针。你可能想要的是&array[1]或只是array1,因为数组可以隐式转换为指向它们的第一个元素的指针。

  4. *a[i]中,您可以访问数组中的第 i 个元素a指向(a本身不是指针,但数组下标运算符像数组一样处理指针)。然后取消引用该复杂类型,这是无效的。只需放下*.

您可以在此处查看最终代码。

您可能

想像这样使用它:

#include <complex>

int main()
{
    std::complex<float> *a;
    std::complex<float> *b;
    std::complex<float> array1[20];
    std::complex<float> array2[20];
    int real_part_array1[20];
    int real_part_array2[20];
    int imag_part_array1[20];
    int imag_part_array2[20];
    a = array1;
    b = array2;
    int i=0;
    for (i=0;i<=19;i++)
    {
    real_part_array1[i] = std::real(a[i]);
    imag_part_array1[i] = std::imag(a[i]);
    real_part_array2[i] = std::real(b[i]);
    imag_part_array2[i] = std::imag(b[i]); 
    }
    return 0;
}
复杂不是一个类型,

而是一个类型模板。因此,您可能希望使用复杂或复杂<双>之类的东西。

真实和 imag 也在 std 命名空间中,因此 std::real 和 std::imag。

现在当你说 a = &array1 时,array1 已经是一个指针,你正在分配一个指向 LHS 的指针,这是一个指针,这是一个类型错误