【问题标题】:complex number types in mixing C(99) and C++混合 C(99) 和 C++ 中的复数类型
【发布时间】:2010-07-26 06:42:15
【问题描述】:

我正在编写一个数学库,它的核心是 C++。稍后它可能会在纯 C 中实现(我想是 C99)。我想我需要一个类似 C 的 API,以便我可以使用 Python 和 matlab 等来使用该库。我的印象是,用 C++ 做这件事很痛苦。

那么在double complex *some_array_in_C99complex<double> *some_array_in_cpp 之间进行转换是否有好的或标准或适当的方式?

我可以只使用void *pointers,但我不确定这是否好。

这可能有点吹毛求疵,因为 ctypes 似乎与 complex<double> 配合得很好,但我担心 matlab 和其他可能的数值环境。

【问题讨论】:

  • 您确定可以在 MATLAB 中使用 C99 complex 吗?
  • 呃,好点子。来自mathworks.com/access/helpdesk/help/techdoc/matlab_external/… 复数双精度矩阵 MATLAB 中最常见的数据类型是复数双精度非稀疏矩阵。这些矩阵是 double 类型,尺寸为 m×n,其中 m 是行数,n 是列数。数据存储为两个双精度数字向量——一个包含实数数据,一个包含虚数数据。所以这很容易。我可能什么都不担心。

标签: c++ c c99 complex-numbers


【解决方案1】:

C99 和 C++0x 标准都指定它们各自的双精度复数类型必须具有与两个双精度数组相同的对齐方式和布局。这意味着您可以避免将参数作为 void * 传递,并且可以(相对)轻松地从任何一种语言调用您的例程,这是许多库所采用的方法。

C++0x 标准保证(第 26.4 节)reinterpret_caststd::complex<double>*double* 会做正确的事;如果我没记错的话,这在标准的早期版本中并没有明确规定。如果您愿意以 C++0x 为目标,您可以使用它来为您的接口做一些更清洁的事情。

考虑到实际的布局和对齐规范被定义为一致,我很想只将头文件中的类型作为语言的条件;您的实现可以使用任何一种语言,并且无论哪种方式,数据都将在内存中正确布局。我不确定 MATLAB 在内部是如何做的,所以我不知道这是否与 MATLAB 兼容;如果他们使用标准的 LAPACK 方法,那么在所有情况下都会在许多但不是所有平台上使用; LAPACK 将其自己的double complex 类型定义为具有两个double 成员的struct,它们通常在内存中的布局方式相同(不能保证),但可以遵循在某些平台上使用不同的调用约定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    相关资源
    最近更新 更多