• 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 ('	');
    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#中直接调用这些内置函数,而不需要封装。

    编程爱好者,关注.NET软件开发,Matlab编程及网络技术

    http://www.cnblogs.com/asxinyu/

    E-mail:1287263703@qq.com

     
  • 相关阅读:
    从新注册 .DLL CMD 运行regsvr32 *.dll注册该DLL 或 regsvr32 /s *.DLL 求证
    短信猫 TIdTCPServer TIdTCPClient
    转:Delphi和Office程序开发 --不错可查阅
    主窗体里面打开子窗体&&打印饼图《Delphi 6数据库开发典型实例》--图表的绘制
    TeeChart Pro 5.0
    软件打开时间、窗体透明度、背景色---《用delphi开发共享软件》-15.1任务管理器
    设置随机启动--《用delphi开发共享软件》-15.1任务管理器
    实现窗体随着鼠标移动(控件)--《用delphi开发共享软件》-15.1任务管理器
    第二百六十一节,Tornado框架模板引擎本质
    第二百六十节,Tornado框架-内置模板方法
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3297053.html
Copyright © 2020-2023  润新知