Matlab.NET混合编程技巧之——找出Matlab内置函数

原文:【原创】Matlab.NET混合编程技巧之——找出Matlab内置函数

Matlab与.NET的混合编程,掌握了基本过程,加上一定的开发经验和算法基础,肯定不难。反之,有时候一个小错误,可能抓破脑袋,加班几个晚上,调试才能解决。同样,由于Matlab.NET混编的特殊性,加上MathWorks的原因,英文文档和没有披露一些详细的细节(甚至不允许反编译MWArray.dll,呵呵,它不允许,不代表你不会哦)。经过很多项目,和大量的实验,也发现了一些小技巧和小秘密,今天就分享其中一个,先做一个简单的铺垫,下一篇将写一个实际例子。

1.Matlab.NET混编小技巧

常规混编时,比如我们要调用plot函数进行绘图,肯定是先自己写一个m函数,把plot封装一下,根据自己的需要,传递数据和参数。实际上,对于Matlab的内置函数,是不需要这么做的。也就是说,对于Matlab的内置函数,是可以直接在C#中进行调用的,只要传递的参数符合要求,就可以得到结果。

2.什么是Matlab的内置函数

本文所说的Matlab内置函数,就是Matlab所谓的"built-in MATLAB function"。

在Matlab中,可以使用exist返回一个名称或者函数的状态,比如是工作区的变量,搜索路径的m函数,dll文件或者内置函数。

比如,我们可以使用exist 来查看plot函数的信息:

1 >> exist plot
2
3 ans =
4
5 5

可以看到,值为5,返回5说明就是"built-in MATLAB function"。从Matlab的组成来看,这些built-in MATLAB
function应该都是matlab的核心函数,因此,也应该都包含在MCR中,因此这是一个直接可以调用的理由吧。

3.Matlab有哪些内置函数

在发现上述小技巧之后,本人亲自对其中几个内置函数进行了测试,证明其是可以在C#中直接调用,然后,我就想,到底有Matlab有多少个内置函数,函数名称有是什么?在把Matlab
Help翻了很久之后,依旧没有结果。只是猜测,可能太多了,Matlab也没有特别说明吧。那怎么办,只能自己动手了(自己动手丰衣足食)。

说说找出内置函数集合的过程吧。

1.首先内置函数应该在核心的计算引擎中,外部工具箱的函数应该不属于(不排除其他工具箱中有部分函数也是内置函数)。

2.使用Matlab Help浏览器,打开核心组件Matlab的Functions节点,可以看到下面这些函数分类:

3.手动将这些大类中的函数手动复制到一个txt文本中,当然格式可能有点乱,不用管。

4.使用C#编写一个简单的函数,将上述txt文本进行处理,把函数名都截取出来,放到一个新的result.txt中。代码如下:


 1 using System;
2 using System.Text ;
3 using System.IO ;
4
5 namespace FunctionNameProcess
6 {
7 class Program
8 {
9 public static void Main(string[] args)
10 {
11 string fileName = @"funcname.txt" ;
12 string saveName = @"result.txt";
13 TextWriter tw = new StreamWriter (saveName ,false );
14 using (TextReader tr = new StreamReader (fileName ))
15 {
16 string temp ;
17 while ((temp = tr.ReadLine ())!=null )
18 {
19 tw.WriteLine (GetBulidInFunction (temp ));
20 }
21 }
22 tw.Close ();
23 Console.Write("Press any key to continue . . . ");
24 Console.ReadKey(true);
25 }
26
27 public static string GetBulidInFunction(string name)
28 {
29 if (name !="") {
30 string[] names = name.Split (‘\t‘);
31 if (names!=null && names [0]!= "") {
32 return names [0];
33 }
34 }
35 return "";
36 }
37 }
38 }

5.最后在matlab中编写一个简单的批处理代码,循环验证result.txt中的函数名的信息,是否属于内置函数即可。matlab代码如下:


 1 %导入数据后是cell类型的数据类型
2 %要进行转换为字符串数组然后调用exist函数进行计算
3 %最终结果也应该是字符串数组,需要声明,添加过程中类型不一样会有错误
4 clc;clear;
5 newData = importdata(‘result.txt‘);
6 vars = fieldnames(newData);
7 for i = 1:length(vars)
8 assignin(‘base‘, vars{i}, newData.(vars{i}));%在命名空间声明变量
9 end
10 result = {};%声明一个空的cell数组类型
11 for i = 1:size(textdata,1)
12 temp =cell2mat(textdata(i,1));
13 resultNo = exist(temp);
14 if resultNo == 5 %返回5说明为内置函数
15 len = size(result,1);
16 result(len+1,1) = mat2cell(temp);
17 end
18 end

OK,可以在result中看到属于内置函数的名称了。剩下的怎么办看你的了,本来想把这些函数都一一翻译出来,可惜太大了,有1000多个,最后放弃了,把这个技巧分享给大家,“授人以鱼不如授人以渔”,大家掌握了方法,其实也不难了。

备注:上面也提到了,其实也有可能其他工具箱也有一些内置函数,但工作量太大,没有全部测试,只是猜测一下,大家以后混编的时候,可以先用exist检测一下即可。至于这些核心组件中的内置函数,我也只测试了其中几个,理论上应该都是可以直接调用的,也不排除有些函数由于其他原因不能用啊,大家对症下药吧。

下次将分享如何在C#中直接调用这些内置函数,而不需要封装。

Matlab.NET混合编程技巧之——找出Matlab内置函数,码迷,mamicode.com

时间: 2024-10-19 01:53:49

Matlab.NET混合编程技巧之——找出Matlab内置函数的相关文章

Matlab.NET混合编程技巧之——直接调用Matlab内置函数(附源码)

原文:[原创]Matlab.NET混合编程技巧之--直接调用Matlab内置函数(附源码) 在我的上一篇文章[原创]Matlab.NET混编技巧之--找出Matlab内置函数中,已经大概的介绍了matlab内置函数在混合编程中的优点,并通过程序找出了matlab中的大部分内置函数,当然更多人关心是如何像我所说得那样,不用直接编译,就直接在C#中调用这些内置函数.本文就带你揭开这些谜团. 声明,这篇文章是需要一点点混合编程基础的,基本概念和过程要懂一点,如果能简单成功混编一个简单的计算或者绘图例子

【新年送礼】国内第一部C#.Net调用Matlab进行混合编程的视频教程【彻底免费无注册码】

其他混合编程文章 1[原创]Matlab.NET混合编程技巧之——直接调用Matlab内置函数(附源码) 2.[原创]Matlab.NET混合编程技巧之——找出Matlab内置函数 3.[原创]Matlab与.NET混编解决人脸识别问题 4.[原创]Matlab与.NET基于类型安全的接口编程入门 5.[原创分享]Matlab.NET混编调用Figure窗体 一.视频说明 2014年的5.1,我将这套视频教程进行了免费下载,免费注册开放:[5.1送礼]国内第一部Matlab和C#.Net混合编程

Matlab.NET混合编程调用Figure窗体

原文:[原创]Matlab.NET混合编程调用Figure窗体 1.前言 做Matlab.NET混合编程好几年了,虽然Matlab很多函数忘记得差不多了,但基本的东西还是能熟练使用.特别是在C#调用Matlab函数这方面,积累了比较多的经验,和使用经验密切相关.根据很多朋友经常遇到的WinForm窗体混编调用Matlab的Figure的问题,花了一些功夫,把这个封装为C#控件,使得大家可以很容易调用Matlab的Figure了. 2.Matlab.NET混合编程概述 这方面就不仔细阐述了,主要是

Matlab C混合编程

由于看的代码里面以及一些工程需要涉及一些Matlab 混合编程,一直想看一下,首先一个就是使用C编写代码,编译之后由Matlab调用,这需要用到Mex函数,mex程序就是根据一定的接口规范(mtlab提出的)编写的一个dll,Mex文件既可以用c,也可以用fortran来编.本文介绍的是用C编写的. 这样做,若是代码中有循环的话,使用matlab的话需要循环解释多次,而使用C语言编译成dll之后,首先可以将循环体放入二进制程序中,利用matlab加快运算,而不是循环解释执行matlab代码.还有

编程之美 找出符合条件的整数

好不容易把内容看懂~ 最主要的一句话:只需要将10k%N的结果与余数信息数组里非空的元素相加,再去模N,看看会不会出现新的余数~ 时间太紧迫~先把自己写的代码贴上,以后再详解 1 int FindMin(int N) 2 { 3 if(N <= 1) 4 return N; 5 6 int* A = new int[N];//这个是记录模N余i之后的数值 7 8 memset(A, -1, sizeof(int) * N); 9 int factor = 1; 10 A[1] = 1; 11 1

【编程题目】找出数组中两个只出现一次的数字 ★★(自己没做出来)

61.找出数组中两个只出现一次的数字(数组)题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是 O(n),空间复杂度是 O(1). 思路:瞄到了一眼提示,说是位运算. 根据异或的运算性质: a ⊕ b ⊕ a = b 把所有的数字都异或一遍得到的结果就是 那两个只出现一次的数字异或的结果. 可怎么分出那两个数字就卡住了. 看了下网上答案,要根据得到的异或值把数字分为两组,再对每一组异或就可以得到这两个数字了! 代码如下: /* 61

Python笔记第3章,模块和模块的常用方法,函数式编程yield,三元运算Lambda表达式,内置涵数,常用模块

<--目录--> 模块和模块的常用方法 函数式编程 yield 三元运算 Lambda表达式 内置涵数 常用模块 [模块和模块的常用方法]至关重要的__init__.py    #包一定要有这个__init__.py文件,他才是包,这样才能通过form 包名 import 模块名(.py文件名)来去引用这个包的某个模块的某个函数功能 判断是否为主文件:__name__ if __name__ == '__main__' 当前文件路径: __file__ 当前文件描述: __doc__ 1)if

Python基础编程 内置函数

内置函数 内置函数(一定记住并且精通) print()屏幕输出 int():pass str():pass bool():pass set(): pass list() 将一个可迭代对象转换成列表 tuple() 将一个可迭代对象转换成元组 dict() 通过相应的方式创建字典. # 创建字典的几种方式 #直接创建 dic = {1: 2} #字典推导式 print({i: 1 for i in range(3)}) dict() #dict创建 dic = dict(one=1, two=2,

mysql数据库编程,内置函数,存储过程(循环插入)

mysql编程注释:行:# 或者 -- 定义变量set 变量名 =变量名注意:为了区分系统变量和字段 在加一个@标识符例如   set @who ='韩当'; 使用select 可以获得当前变量的值 select 10,15,20 into @a,@b,@c; 注意:=应该是赋值,但是在select语句内,就成了关系等于,使用专门的赋值运算符:=同样使用与set 1.作用域, 用户定义的函数,是全局的(函数内可以),村子局部作用域变量,函数内定义的变量2.有效期,回话结束(连接结束) 内置函数