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中不能成立,
吃饭去了未完待续。。。。。