首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >符号矩阵的渐近,打印轨迹并生成C代码

符号矩阵的渐近,打印轨迹并生成C代码
EN

Stack Overflow用户
提问于 2020-12-02 04:20:58
回答 1查看 419关注 0票数 3

我是个新手,我想打印符号矩阵的轨迹,并用函数ccode生成C代码

目前,我有以下信息:

代码语言:javascript
复制
import sympy as sp

# Creates a symbolic matrix (3x3) with symbol A
A = sp.MatrixSymbol('A', 3, 3)

# Trace of a matrix
traceM=sp.Trace(A)

# Generate C code
print(sp.ccode(traceM))

如果我打印(sp.pprint)矩阵A,我将得到:

代码语言:javascript
复制
In [49]:sp.pprint(sp.Matrix(A))

如果我打印A的轨迹,则会出现以下错误

代码语言:javascript
复制
In [50]:sp.pprint(sp.Matrix(traceM))

TypeError: 
Data type not understood; expecting list of lists or lists of values.

我在跳着想要

此外,如果我尝试从跟踪生成C代码,我将得到以下消息

代码语言:javascript
复制
In [51]: print(sp.ccode(traceM))
// Not supported in C:
// Trace
Trace(A)

我一直在想:

代码语言:javascript
复制
A[0, 0]+A[1, 1]+A[2, 2]

有人能帮我一把吗?

注意:如果我使用numpy函数(traceM=numpy.trace(A)),它会给出预期的结果……但我应该也能得到同样的结果...

诚挚的问候,

EN

回答 1

Stack Overflow用户

发布于 2020-12-04 23:56:02

因此,我认为这里的目标是展开该跟踪表达式,并将其替换为显式求和。我发现执行展开过程的唯一方法是通过使用rewrite (我被暗示这是因为Trace类有一个名为_eval_rewrite_as_Sum的方法)。

用于生成C源代码的模块是codegen module (也请参阅Aaron Meurer的codegen教程及其github repo)。

这是在SymPy 1.7上测试的

代码语言:javascript
复制
import sympy as sp
from sympy.utilities.codegen import codegen
N=3
A = sp.MatrixSymbol('A', N, N)
traceM = sp.Trace(A).rewrite(sp.Sum)
[(c_name, c_code), (h_name, c_header)] = codegen(("f", traceM), "C89", "test", header=False, empty=False)
print(c_code)

结果是这样的:

代码语言:javascript
复制
#include "test.h"
#include <math.h>
double f(double *A) {
   double f_result;
   f_result = A[0] + A[4] + A[8];
   return f_result;
}

需要注意的一件事是,2D数组A is accessed as a 1-dimensional array

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65097927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档