关于c#与matlab混编syms函数、区间变量、参数等问题的总结

18年7月底入职一家国企,赶上一个项目做材料仿真软件,遇到的需求是需要在c#界面输入参数(一个为区间变量,其余为定值),用matlab处理算法,制作图像,并且在c#界面显示出来,先自学了几天matlab和c#的基础,以前是做安卓,java这一块的。

最开始用的定义符号变量syms,然后通过integral函数积分,最后通过plot函数作图,在c#界面只需要导入MVArray包和matlab写好程序的dll文件,调用传参数即可,这些网上有很多教程自己查找即可,这时候出现了问题c#使用matlab写的方法提示:

未定义与 'char' 类型的输入参数相对应的函数 'syms'。 

但是我写的算法作图程序在matlab是完美运行的,随即在网络寻找答案,翻遍了c#与matlab中syms函数错误问题,要么没回复,要么让我加什么matlab运行库,改路径。。。。。能这么回复都是些没遇到过这个问题,最终的答复都是不了了之没有确切答案只是说了c#中没有sysm函数不能用也没说解决方案,最终找到了采用匿名函数@(x)来实现替代syms函数的用法

因为涉及算法保密,就举个最简单的例子

修改前:

syms x;
d = 0.1;
q=int(x*d,0,2);
plot(d,q)

修改后:

d = 0.1;
q = integral(@(x)x*d,0,2);
plot(d,q)

根据需求需要设置d为区间变量查看由于d的变化,该函数的变化图像,由于在学校学的思维首先选择了for循环,查了查资料matlab中有简化版的for循环的函数arrayfun可以实现有区间变量的定积分代码如下:

含区间变量修改后:

d = 0.1:0.1:0.5;
q = arrayfun(@(d)integral(@(x)x*d,0,2),d);
plot(d,q)

相当于给定积分嵌套了一层for循环,最终也做出了目标有区间变量的定积分,之后我们这个软件不止一个变量,需要多个变量,其中一个为区间变量,其余为定值,查看某个区间变量对该函数的影响,之前的问题都是自己查资料解决的这个问题是真没法办法,参照我之前的思路

比如定积分为 ∫0→1   x*a*b*c dx中a,b,c任意两个为定值,剩余为区间变量,我能想到的解决方案就两种第一种写一个数组array保存字符串’a‘,’b‘,’c‘然后参数有个flag依次与array用strcmp方法比较,写三个q = arrayfun(@(a)integral(@(x)x*a*b*c,0,2),a)、q = arrayfun(@(b)integral(@(x)x*a*b*c,0,2),b)、q = arrayfun(@(c)integral(@(x)x*a*b*c,0,2),c) 这种麻烦的笨方法,和第二种参数为flag,然后需要新建一个变量等于flag对应字符串的变量,然后后文所有区间变量用到的变量名都用flag代替例如

q = arrayfun(@(flag)integral(@(x)x*a*b*c,0,2),flag)这种形式处理,然而积分x*a*b*c中不含有flag参数,因此这种思路在matlab中不能成立,

 

吃饭去了未完待续。。。。。

 

 

 

 

 

 

 

 

 

 

 

 

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值