如何将 Maple 中的符号变量导出到文本文件(Matlab 格式)?
Posted
技术标签:
【中文标题】如何将 Maple 中的符号变量导出到文本文件(Matlab 格式)?【英文标题】:How to export a symbolic variable from Maple into a textfile (in Matlab format)? 【发布时间】:2014-05-24 17:00:53 【问题描述】:我在 Maple 中有一个符号矩阵(18×18),我想导出到 Matlab。
我使用with(CodeGeneration)
然后Matlab(...)
将其转换为Matlab 语法,但它没有响应,因为矩阵太大。有没有其他方法可以做到这一点并将其保存到文本文件中。
P.S.:H 是这样的:
H = [0.750e1 0 0 -0.170400e1 * cos(q04) * cos(q05) * cos(q06) + 0.335e-1 * sin(q06) * cos(q05) * cos(q04) * cos(q11) + 0.335e-1 * sin(q11) * cos(q04) * cos(q05) * cos(q06) - 0.168e-1 * sin(q25) * sin(q24) * cos(q21) * sin(q04) * sin(q06) - 0.168e-1 * cos(q04) * sin(q05) * cos(q25) * cos(q23) * cos(q22) + 0.168e-1 * cos(q04) * sin(q05) * cos(q25) * sin(q23) * sin(q22) + 0.170400e1 * sin(q04) * sin(q06) + 0.176150e1 * cos(q06) * cos(q22) * sin(q04) * cos(q21) + 0.735e-1 * cos(q06) * sin(q22) * sin(q04) * cos(q21) + 0.176150e1 * sin(q21) * cos(q22) * sin(q04) * sin(q06) + 0.735e-1 * sin(q21) * sin(q22) * sin(q04) * sin(q06) + 0.176150e1 * sin(q06) * cos(q05) * cos(q22) * cos(q04) * cos(q21) + 0.735e-1 * sin(q06) * cos(q05) * sin(q22) * cos(q04) * cos(q21) - 0.176150e1 * sin(q21) * cos(q22) * cos(q04) * cos(q05) * cos(q06) - 0.735e-1 * sin(q21) * sin(q22) * cos(q04) * cos(q05) * cos(q06) - 0.168e-1 * sin(q25) * cos(q24) * cos(q23) * cos(q22) * sin(q21) * cos(q04) * cos(q05) * cos(q06) + 0.168e-1 * sin(q25) * cos(q24) * sin(q23) * sin(q22) * sin(q21) * cos(q04) * cos(q05) * cos(q06) + 0.168e-1 * cos(q11) * sin(q15) * sin(q14) * sin(q04) * sin(q06) + 0.168e-1 * cos(q04) * sin(q05) * cos(q13) * cos(q12) * cos(q15) - 0.168e-1 * cos(q04) * sin(q05) * sin(q13) * sin(q12) * cos(q15) + 0.168e-1 * cos(q06) * sin(q25) * sin(q24) * sin(q04) * sin(q21) + 0.168e-1 * cos(q06) * sin(q15) * sin(q04) * sin(q11) * sin(q14) + 0.168e-1 * cos(q13) * sin(q12) * sin(q11) * cos(q15) * sin(q04) * sin(q06) + 0.168e-1 * sin(q13) * cos(q12) * sin(q11) * cos(q15) * sin(q04) * sin(q06) - 0.168e-1 * cos(q11) * sin(q15) * sin(q14) * cos(q04) * cos(q05) * cos(q06) - 0.168e-1 * cos(q04) * sin(q05) * cos(q13) * sin(q12) * sin(q15) * cos(q14) - 0.168e-1 * cos(q04) * sin(q05) * sin(q13) * cos(q12) * sin(q15) * cos(q14) - 0.168e-1 * cos(q06) * cos(q15) * sin(q04) * cos(q11) * sin(q12) * cos(q13) - 0.168e-1 * cos(q06) * cos(q15) * sin(q04) * cos(q11) * cos(q12) * sin(q13) + 0.168e-1 * sin(q06) * cos(q05) * sin(q15) * cos(q04) * sin(q11) * sin(q14) - 0.11040e0 * sin(q06) * cos(q05) * cos(q04) * cos(q11) * cos(q12) * sin(q13) - 0.11040e0 * sin(q06) * cos(q05) * cos(q04) * cos(q11) * sin(q12) * cos(q13) - 0.9320e-1 * cos(q06) * sin(q04) * cos(q11) * cos(q12) * sin(q14) * cos(q13) + 0.9320e-1 * cos(q06) * sin(q04) * cos(q11) * sin(q12) * sin(q14) * sin(q13) - 0.11040e0 * sin(q11) * cos(q12) * sin(q13) * cos(q04) * cos(q05) * cos(q06) - 0.11040e0 * sin(q11) * sin(q12) * cos(q13) * cos(q04) * cos(q05) * cos(q06) + 0.9320e-1 * cos(q13) * cos(q12) * sin(q11) * sin(q14) * sin(q04) * sin(q06) - 0.9320e-1 * sin(q13) * sin(q12) * sin(q11) * sin(q14) * sin(q04) * sin(q06) + 0.176150e1 * cos(q04) * sin(q05) * sin(q12) - 0.735e-1 * cos(q04) * sin(q05) * cos(q12) + 0.335e-1 * cos(q06) * sin(q04) * cos(q11) - 0.335e-1 * sin(q11) * sin(q04) * sin(q06) + 0.176150e1 * cos(q06) * sin(q04) * cos(q11) * cos(q12) + 0.735e-1 * cos(q06) * sin(q04) * cos(q11) * sin(q12) - 0.176150e1 * sin(q11) * cos(q12) * sin(q04) * sin(q06) - 0.735e-1 * sin(q11) * sin(q12) * sin(q04) * sin(q06) - 0.168e-1 * sin(q06) * cos(q05) * sin(q15) * cos(q04) * cos(q11) * cos(q12) * cos(q14) * cos(q13) + 0.168e-1 * sin(q06) * cos(q05) * sin(q15) * cos(q04) * cos(q11) * sin(q12) * cos(q14) * sin(q13) - 0.168e-1 * cos(q13) * cos(q12) * sin(q11) * sin(q15) * cos(q14) * cos(q04) * cos(q05) * cos(q06) + 0.168e-1 * sin(q13) * sin(q12) * sin(q11) * sin(q15) * cos(q14) * cos(q04) * cos(q05) * cos(q06) - 0.3500e0 * cos(q04) * sin(q05) * sin(q12) * cos(q13) - 0.3500e0 * cos(q04) * sin(q05) * cos(q12) * sin(q13) - 0.9320e-1 * cos(q06) * sin(q04) * sin(q11) * cos(q14) - 0.9320e-1 * cos(q11) * cos(q14) * sin(q04) * sin(q06) - 0.11040e0 * cos(q04) * sin(q05) * sin(q12) * sin(q13) + 0.11040e0 * cos(q04) * sin(q05) * cos(q12) * cos(q13) + 0.168e-1 * sin(q06) * cos(q05) * sin(q25) * cos(q24) * cos(q22) * cos(q23) * cos(q04) * cos(q21) - 0.168e-1 * sin(q06) * cos(q05) * sin(q25) * cos(q24) * sin(q22) * sin(q23) * cos(q04) * cos(q21) - 0.3500e0 * sin(q06) * cos(q05) * cos(q04) * cos(q11) * cos(q12) * cos(q13) + 0.3500e0 * sin(q06) * cos(q05) * cos(q04) * cos(q11) * sin(q12) * sin(q13) - 0.3500e0 * sin(q11) * cos(q12) * cos(q13) * cos(q04) * cos(q05) * cos(q06) + 0.3500e0 * sin(q11) * sin(q12) * sin(q13) * cos(q04) * cos(q05) * cos(q06) + 0.168e-1 * cos(q06) * sin(q25) * cos(q24) * cos(q22) * cos(q23) * sin(q04) * cos(q21) - 0.168e-1 * cos(q06) * sin(q25) * cos(q24) * sin(q22) * sin(q23) * sin(q04) * cos(q21) + 0.168e-1 * sin(q06) * cos(q05) * cos(q25) * sin(q22) * cos(q23) * cos(q04) * cos(q21) + 0.168e-1 * sin(q06) * cos(q05) * cos(q25) * cos(q22) * sin(q23) * cos(q04) * cos(q21) + 0.168e-1 * sin(q25) * cos(q24) * cos(q23) * cos(q22) * sin(q21) * sin(q04) * sin(q06) - 0.168e-1 * sin(q25) * cos(q24) * sin(q23) * sin(q22) * sin(q21) * sin(q04) * sin(q06) - 0.168e-1 * cos(q25) * cos(q23) * sin(q22) * sin(q21) * cos(q04) * cos(q05) * cos(q06) - 0.168e-1 * cos(q25) * sin(q23) * cos(q22) * sin(q21) * cos(q04) * cos(q05) * cos(q06) - 0.43660e0 * cos(q04) * sin(q05) * sin(q22) * sin(q23) + 0.43660e0 * cos(q04) * sin(q05) * cos(q22) * cos(q23) + 0.176150e1 * cos(q04) ...]
但是要长很多
【问题讨论】:
你能导出更小的矩阵吗?这有点小技巧,但是将矩阵分解成行或列怎么样?ExportMatrix
会起作用还是仅适用于数字数据?除非您的矩阵元素依赖于自定义或专用函数,否则代码生成似乎有点过头了。您真的只需要一种将矩阵转换为 Matlab 可以处理的文本格式的方法。
@horchler:ExportMatrix
仅适用于数字数据。 “专业功能”是什么意思?
如果您可以更具体地了解矩阵的内容,甚至提供演示代码,它可能会帮助人们帮助您。它是否包含您编写的自定义函数或可能特定于 Maple 的专用函数?如果它是多项式、三角函数、指数和任何数学环境都有的其他东西,那么您可以考虑将它们直接导出为文本并自己(或在 Matlab 中)对 Matlab 进行任何额外的翻译。我没有 Maple,所以在这方面我无法帮助你。这个网站上的 Maple 用户似乎并不多。
@horchler 谢谢。我编辑了我的帖子并添加了 H 的示例(H 是有腿机器人动态模型的一部分)。
【参考方案1】:
如果您同时拥有 Maple 和 MATLAB,则不必将 Maple 矩阵导出到单独的文件以与 MATLAB 共享:您可以使用 MATLAB 连接器将其直接复制到 MATLAB 内存。请参阅setvar 的文档。
也就是说,由于 Maple 容器中有符号量,因此您必须先决定在 MATLAB 中如何表示这些量,然后再将它们移动。最简单的方法是简单地构建一个接受数量作为参数并生成数字矩阵的函数。您可以使用 Maple 的代码生成工具为此类函数生成 MATLAB 代码。
例如,在 Maple 中定义如下符号向量:
V := <x^2+1, sin(x+y)+cos(x+y), 2*exp(y), (3/2)*ln(y)>;
对于这个或任何这样的向量,我们可以使用 Maple 的代码生成工具将其转换为 MATLAB 函数:
CodeGeneration[Matlab]( codegen[makeproc]( V, [x,y] ) );
(请注意,我已经在上面明确编写了符号列表 [x,y],但如果需要推广这种方法,可以使用 indets 计算它。)
对于本示例,Maple 18.01 生成以下 MATLAB 代码:
function cg3return = cg3(x, y)
A = [0 0 0 0];
A(1) = x ^ 2 + 1;
A(2) = sin(x + y) + cos(x + y);
A(3) = 0.2e1 * exp(y);
A(4) = 0.3e1 / 0.2e1 * log(y);
cg3return = A;
【讨论】:
以上是关于如何将 Maple 中的符号变量导出到文本文件(Matlab 格式)?的主要内容,如果未能解决你的问题,请参考以下文章
将数据导出到 CSV 平面文件时如何解决嵌入的文本限定符问题?