【问题标题】:Convert Python-style matrix to C-style matrix将 Python 风格的矩阵转换为 C 风格的矩阵
【发布时间】:2020-08-28 07:21:06
【问题描述】:

我正在使用 Python(x,y) / Spyder / Sympy 进行一些符号矩阵计算,然后我想将其写入我的 C 程序中。

是否有一种工具(Python 与否)可以将这个以 Python 风格编写的结果矩阵作为一行或多行(有效)C 代码输出?

例如如果我定义

A = [[a, 0] [b, 0]]
B = [[c, d] [0, 0]]

然后让Python计算并打印A*B然后我会得到

Matrix([[a*c, a*d], [b*c d*c]])

然后我想将其转换为:

result[0][0] = a*c;
result[0][1] = a*d;
result[1][0] = b*c;
result[1][1] = d*c;

我可以在 Python 中手动完成它的核心,因为基本算术运算符在 Python 和 C 中是相同的。

但是一旦我们开始使用幂和三角函数,情况就会发生一些变化......而且可能还有其他一些我现在无法想到的东西,它们会在我的矩阵中出现变得更复杂并使用更高级的标准数学函数(相信我,他们会的)。

所以一些可以为我自动化的代码或工具会很棒。

【问题讨论】:

  • 您需要自动工具还是简单的代码也有效?
  • 我在 Google 上搜索了 Python 到 C 代码生成器,但令人惊讶的是没有发现任何真正有用的东西。但是attempts at such a thing did的链接。
  • 不知道这是否是一个有意义的解决方案,但你可以迭代你的python矩阵(假设它是一个二维矩阵),计算像result[0][0] = a*c;这样的字符串,将它们存储在一个变量中,然后写一个txt文件
  • @Mattia Surricchio 我不明白你的问题。如果“简单代码”是指一些 Python 代码来做我需要的事情,那么它也是自动的(我只需将我的 Python 矩阵放在某个地方并在这些矩阵上运行 Python 代码,而无需手动编写任何 C 代码) 所以我会很高兴。
  • 是的,对不起,我表达得很糟糕。我在问手写代码是否可以,或者您正在搜索现有的 Python 工具/库(例如用于向量的 numpy、用于绘图 ecc 的 matplotlib...)

标签: python c matrix converters


【解决方案1】:

在关于任意维矩阵的问题之后:Arbitrary matrix,我使用np.ndenumerate()对矩阵进行迭代。

import numpy as np

arr = np.random.random([4,5,2,6])
print(arr)
c_code = ''

for idx, value in np.ndenumerate(arr):
    print(idx, value)
    index_c = ""
    for index in idx:
        #print('print index')
        #print(index)
        index_c = index_c + '[' + str(index) + ']'

    cell_content = arr[idx]

    #print('printing content')
    #print(cell_content)

    #print('print index_c')
    #print(str(index_c))

    single_entry = ''
    single_entry = 'arr'+str(index_c)+'='+ str(cell_content)

    #print('printing single entry')
    #print(single_entry)

    c_code = c_code + str(single_entry) + ';' + '\n'

print('Printing C_code')
print(c_code)

我留下了一些测试照片。

我使用arr = np.random.random([4,5,2,6])生成了一个[4,5,2,6]随机值的维度矩阵(只是为了测试,你可以使用自己的矩阵)。

矩阵的 C 代码包含在 c_code 变量中,类似于:

arr[3][3][1][2]=0.15905407213419076;
arr[3][3][1][3]=0.11357812551781832;
arr[3][3][1][4]=0.8884023323331601;

例如。

【讨论】:

  • 我自己也可以做到这一点,但是如果cell_content包含非C语法,比如a**2呢?
  • 这是另一个问题。您还应该对这些命令进行手动转换。因此,如果您获得该元素,则将其映射到 C 等效指令上。你可以从我的函数中获取 c_code(它将把字符串放在 "=" 的右侧)迭代它并交换你需要的所有字符
  • 在任何情况下,我认为没有比这两个 sintaxes 之间的残酷映射更简单的方法了。
  • 但世界上的某人不是已经完成并提供了它吗?
  • 嗯,你要的是语言翻译,这并不容易,而且是计算机科学的主要问题之一。 Matlab 有自己的 Matlab 到 C++ 转换器。你可以看看 Cython,它是一个 Python -> C 转换器:cython.org
猜你喜欢
  • 2020-09-21
  • 1970-01-01
  • 1970-01-01
  • 2014-09-15
  • 2013-10-26
  • 1970-01-01
  • 2023-01-27
  • 2014-03-12
  • 1970-01-01
相关资源
最近更新 更多