【问题标题】:matrix from C function to Python从 C 函数到 Python 的矩阵
【发布时间】:2012-07-31 13:27:00
【问题描述】:

我正在使用 python 和 ctypes。我有一个 C 函数将四元数(类似于虚数)转换为矩阵。我知道,在像参数这样的函数中发送结果变量是不好的基调,所以我怎样才能将矩阵返回到类型数组 c_float*16 中的 python 代码。

float* QuaternionToMatrix(Quaternion q)
{
    float matrix[16];

    matrix[ 0] = 1.0f - 2.0f * ( q.y * q.y + q.z * q.z );
    matrix[ 1] = 2.0f * (q.x * q.y + q.z * q.w);
    matrix[ 2] = 2.0f * (q.x * q.z - q.y * q.w);
    matrix[ 3] = 0.0f;

    matrix[ 4] = 2.0f * ( q.x * q.y - q.z * q.w );
    matrix[ 5] = 1.0f - 2.0f * ( q.x * q.x + q.z * q.z );
    matrix[ 6] = 2.0f * (q.z * q.y + q.x * q.w );
    matrix[ 7] = 0.0f;

    matrix[ 8] = 2.0f * ( q.x * q.z + q.y * q.w );
    matrix[ 9] = 2.0f * ( q.y * q.z - q.x * q.w );
    matrix[10] = 1.0f - 2.0f * ( q.x * q.x + q.y * q.y );
    matrix[11] = 0.0f;

    matrix[12] = 0;
    matrix[13] = 0;
    matrix[14] = 0;
    matrix[15] = 1.0f;

    float* a = matrix;

    return a;
}

【问题讨论】:

  • 如果我理解正确,你可以简单地返回一个元组,而不是 python 中的数组。 (就像 C 中的列表)
  • 你能写个例子吗,我如何在 C 中创建列表以将其返回到 python 代码。
  • 您正在返回一个指向局部变量的指针。这会导致内存损坏。

标签: python function matrix return ctypes


【解决方案1】:

您正在返回一个指向局部变量的指针。这将导致内存损坏。我建议创建一个 struct 封装您的矩阵并返回它:

typedef struct matrix {
    float data[16];
} matrix;

matrix QuaternionToMatrix(Quaternion q) {
    ...
}

因为这会导致复制一些内存量(约 512 字节),所以最好将矩阵作为输出参数传递:

void QuaternionToMatrix(Quaternion q, matrix *matrix) {
    ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多