C++调用matlab出错

汉尼拔勇闯天涯 2013-09-22 08:08:24
我用MATLAB写M文件生成DLL文件供C++调用。调用时出错:undefined function or method 'syms' for input argument of type 'char'.不知道是什么问题,望各位大神指教。我坐等答案!!
我的M文件是根据连续系统的状态空间的A和B,求出离散化的状态空间矩阵G,H.M文件源代码如下:
function [G,H]=LaplaceForAB(wn,zeta,T) %T是采样时间
A=[0,1,0;0,0,1;0,(-wn*wn),(-2)*zeta*wn];
B=[0;0;1];I=[1,0,0;0,1,0;0,0,1];
sym s t;
LPL=inv(s*I-A); %求逆
F=ilaplace(LPL,s,T); %F就是离散后的矩阵A
G=F;
H=int(F,0,T)*B; %求离散化后的B,对F进行积分再乘以B
end
...全文
230 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
我知道了原因,和大家分享一下:matlab的混合编程中,不能使用符号函数(比如sym,syms),顺便说一下,画bode图的margin函数也不能使用,只能使用bode函数。
图灵狗 2013-09-23
  • 打赏
  • 举报
回复
It is possible that you do not have the appropriate toolbox installed. Run the command ver on the command line, and check whether the Symbolic Toolbox is one of the installed toolboxes.
引用 2 楼 hannibaychty 的回复:
[quote=引用 1 楼 turingo 的回复:] 参考http://wenku.baidu.com/view/5fed13d9a58da0116c1749c0.html 大哥,这些我都实现了,对于一般的M文件,C++调用matlab是没什么问题的。但是当M文件中出现定义符号变量的函数syms,生成的DLL文件被C++调用时,会不错:undefined function or method 'syms' for input argument of type 'char'。
  • 打赏
  • 举报
回复
[quote=引用 1 楼 turingo 的回复:] 参考http://wenku.baidu.com/view/5fed13d9a58da0116c1749c0.html 大哥,这些我都实现了,对于一般的M文件,C++调用matlab是没什么问题的。但是当M文件中出现定义符号变量的函数syms,生成的DLL文件被C++调用时,会不错:undefined function or method 'syms' for input argument of type 'char'。
图灵狗 2013-09-23
  • 打赏
  • 举报
回复
参考http://wenku.baidu.com/view/5fed13d9a58da0116c1749c0.html
引用 楼主 hannibaychty 的回复:
我用MATLAB写M文件生成DLL文件供C++调用。调用时出错:undefined function or method 'syms' for input argument of type 'char'.不知道是什么问题,望各位大神指教。我坐等答案!! 我的M文件是根据连续系统的状态空间的A和B,求出离散化的状态空间矩阵G,H.M文件源代码如下: function [G,H]=LaplaceForAB(wn,zeta,T) %T是采样时间 A=[0,1,0;0,0,1;0,(-wn*wn),(-2)*zeta*wn]; B=[0;0;1];I=[1,0,0;0,1,0;0,0,1]; sym s t; LPL=inv(s*I-A); %求逆 F=ilaplace(LPL,s,T); %F就是离散后的矩阵A G=F; H=int(F,0,T)*B; %求离散化后的B,对F进行积分再乘以B end
赵4老师 2013-09-23
  • 打赏
  • 举报
回复
使用命令重定向操作符可以使用重定向操作符将命令输入和输出数据流从默认位置重定
向到不同的位置。输入或输出数据流的位置即为句柄。

下表将列出可用的句柄。

句柄      句柄的数字代号 描述
STDIN     0              键盘输入
STDOUT    1              输出到命令提示符窗口
STDERR    2              错误输出到命令提示符窗口
UNDEFINED 3-9            这些句柄由应用程序单独定义,并且是各个工具特定的。

数字 0 到 9 代表前 10 个句柄。可以使用命令 Cmd.exe 运行程序并将该程序前 10 个
句柄中的任何一个重定向。要指定想使用的句柄,可在重定向操作符前面键入该句柄的
数字。如果未定义句柄,则默认的 < 重定向输入操作符是 0,而默认的 > 重定向输出
操作符是 1。键入 > 或 < 操作符之后,必须指定要读取或写入数据的位置。可以指定
文件名或另一个现有的句柄。

要指定重定向到现有句柄,请使用与 (&) 字符,后面接要重定向的句柄号
(例如 &句柄#)。例如,下面的命令可以将句柄 2(即 STDERR)重定向到
句柄 1(即 STDOUT):

2>&1

下表列出了可用于将输入和输出数据流进行重定向的操作符。

重定向操作符 描述
> 将命令输出写入到文件或设备(例如打印机)中,而不是写在命令提示符窗口或句柄中。
< 从文件中而不是从键盘或句柄中读入命令输入。
>> 将命令输出添加到文件末尾而不删除文件中的信息。
>& 将一个句柄的输出写入到另一个句柄的输入中。
<& 从一个句柄读取输入并将其写入到另一个句柄输出中。
| 从一个命令中读取输出并将其写入另一个命令的输入中。也称作管道。

默认情况下,可以从键盘将命令输入(即 STDIN 句柄)发送到 Cmd.exe,然后由
Cmd.exe 将命令输出(即 STDOUT 句柄)发送到命令提示符窗口。

重定向输入 (<)
要将键盘输入重定向到文件或设备,请使用 < 操作符。例如,要从 File.txt 获取
sort 命令的输入,请键入:

sort<file.txt

File.txt 的内容将以字母顺序列表的方式显示在命令提示符窗口中。

< 操作符可以打开具有只读访问的指定文件名。所以,不能使用该操作符向文件中写入
信息。例如,如果以 <&2 启动程序,则所有试图读取句柄 0 的操作都将失败,因为句
柄 2 最初是以只写访问打开的。

 注意

0 是 < 重定向输入操作符的默认句柄。
重定向输出 (>)
几乎所有的命令都将输出发送到命令提示符窗口。即使将输出发送到驱动器或打印机的
命令也会在命令提示符窗口显示消息和提示。

要将输出从命令提示符窗口重定向到文件或设备,请使用 > 操作符。可以在许多命令中
使用该操作符。例如,要将 dir 输出重定向到 Dirlist.txt,请键入:

dir>dirlist.txt

如果 Dirlist.txt 不存在,Cmd.exe 将创建该文件。如果 Dirlist.txt 存在,Cmd.exe
将使用 dir 命令的输出替换文件中的信息。

要运行 netsh routing dump 命令,然后将输出发送到 Route.cfg,请键入:

netsh routing dump>c:\route.cfg

> 操作符可以打开具有只写访问属性的指定文件。所以,不能使用该操作符读取文件。
例如,如果使用重定向 >&0 启动程序,则所有试图写入句柄 1 的操作都将失败,因为
句柄 0 最初是以只读访问打开的。

 注意

1 是 > 重定向输出操作符的默认句柄。
复制句柄
重定向操作符 & 可以将输出或输入从一个指定句柄复制到另一个指定的句柄。例如,
要将 dir 输出发送到 File.txt 并将错误输出发送到 File.txt,请键入:

dir>c:\file.txt 2>&1

复制句柄时,可以复制该句柄原状态的所有特性。例如,如果一个句柄具有只写访问的
属性,则该句柄的所有副本都具有只写访问属性。不能将一个具有只读访问属性的句柄
复制到另一个具有只写访问属性的句柄。

使用 & 操作符重定向输入和副本
要将重定向输入操作符 (<) 与复制操作符 (&) 一起使用,指定的文件必须已经存在。
如果输入文件存在,Cmd.exe 将以只读方式打开该文件,然后将文件中包含的字符作为
输入发送到此命令(如同从键盘输入一样)。如果指定了句柄,Cmd.exe 将指定的句柄
复制到系统现有的句柄中。

例如,要以句柄 0 输入读取(即 STDIN)的方式打开 File.txt,请键入:

<file.txt

要打开 File.txt,并在内容排序后将输出发送到命令提示符窗口(即 STDOUT),请键入:

sort<file.txt

要查找 File.txt,然后将句柄 1(即 STDOUT)和句柄 2(即 STDERR)重定向到
Search.txt,请键入:

findfile file.txt>search.txt 2<&1

要以句柄 0 输入读取(即 STDIN)的方式复制用户定义句柄 3,请键入:

<&3

使用 & 操作符重定向输出和复制
如果将输出重定向到文件且指定了现有的文件名,Cmd.exe 将以只写方式打开文件并覆
盖该文件内容。如果指定了句柄,Cmd.exe 将文件复制到现有句柄中。

要将用户定义句柄 3 复制到句柄 1,请键入:

>&3

要将包括句柄 2(即 STDERR)的所有输出从 ipconfig 命令重定向到
句柄 1(即 STDOUT),然后将输出重定向到 Output.log,请键入:

ipconfig.exe>>output.log 2>&1

使用 >> 重定向操作符追加输出
要从命令中将输出添加到文件末尾而不丢失文件中已存在的任何信息,请使用两个连续
的大于号(即 >>)。例如,下面的命令可以将由 dir 命令生成的目录列表追加到
Dirlist.txt 文件:

dir>>dirlist.txt

要将 netstat 命令的输出追加到 Tcpinfo.txt 的末尾,请键入:

netstat>>tcpinfo.txt

使用管道操作符 (|)
管道操作符 (|) 可以提取一个命令的输出(默认情况下是 STDOUT),然后将其导入另
一个命令的输入中(默认情况下是 STDIN)。例如,下面的命令将对目录分类:

dir | sort

在本例中,将同时启动两个命令,但随后 sort 命令会暂停,直到它接收到 dir 命令
的输出为止。sort 命令使用 dir 命令的输出作为输入,然后将输出发送到
句柄 1(即 STDOUT)。

合并带重定向操作符的命令
可以通过合并带有其他命令和文件名的筛选器命令创建自定义命令。例如,可以使用以
下命令存储包含“LOG”字符串的文件名:

dir /b | find "LOG" > loglist.txt

dir 命令的输出通过 find 筛选器命令发送。包含字符串 "LOG" 的文件名作为文件名
列表(例如,NetshConfig.log、Logdat.svd 和 Mylog.bat)存储在文件
Loglist.txt 中。

要在相同命令中使用多个筛选器,请使用管道 (|) 分隔筛选器。例如,下面的命令将
搜索 C 盘上的每个目录以查找包含 "LOG" 字符串的文件名,并且在命令提示符窗口中
每次显示一屏:

dir c:\ /s /b | find "LOG" | more

利用管道 (|) 可以将 Cmd.exe 导向为通过 find 筛选器命令发送 dir 命令输出。
find 命令只选择包含字符串 "LOG" 的文件名。more 命令可以显示由 find 命令选择
的文件名(在命令提示符窗口中每次显示一屏)。有关筛选器命令的详细信息,请参阅
使用筛选器。

  • 打赏
  • 举报
回复
讲的我有点晕,请问怎样“让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。”
引用 4 楼 zhao4zhong1 的回复:
不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。
  • 打赏
  • 举报
回复
[quote=引用 3 楼 turingo 的回复:] It is possible that you do not have the appropriate toolbox installed. Run the command ver on the command line, and check whether the Symbolic Toolbox is one of the installed toolboxes. I have run the command ver on the command line, and found having the Symbolic Toolbox.
赵4老师 2013-09-23
  • 打赏
  • 举报
回复
不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧