zoukankan      html  css  js  c++  java
  • C#中使用MATLAB

    闲来无聊写篇文章聊以慰藉。

    本文写了Matlab的2种基本调用方式,且同时和C#内部的Math类做了性能对比。

    软件:Windows 7 x64,Microsoft Visual Studio 2012 RC,Matlab R2012a

    一、首先装好Matlab R2012a。

    二、打开Matlab,File->New->Function

    输入如下代码

    function result = TestFun(x, y)
    result = power(x, y);
    end

    然后保存

    三、File->New->Deployment Project  Type一定要选择.Net Assembly

    image

    四、添加一个Class,然后将上面我们新建的文件放进去。

    image

    五、点击编译

    imageimageimage

    六(1)、在项目目录中可以看到distrib和src文件夹,这里我们直接将TestMatlab.dll引用到项目中。另外再添加MWArray.dll如下图所示

    image

    七(1)、输入如下代码:

    			List<double> x = new List<double>();
    			List<double> y = new List<double>();
    			List<double> z1 = new List<double>();
    			List<double> z2 = new List<double>();
    			Random random = new Random();
    
    			for (int i = 0; i < 1000000; i++)
    			{
    				x.Add(random.Next(1000) * random.NextDouble());
    				y.Add(random.Next(1000) * random.NextDouble());
    			}
    			DateTime a = DateTime.Now;
    			for (int i = 0; i < x.Count; i++)
    			{
    				z1.Add(Math.Pow(x[i], y[i]));
    			}
    			DateTime b = DateTime.Now;
    			Console.WriteLine((b - a).TotalMilliseconds);
    
    			a = DateTime.Now;
    			for (int i = 0; i < x.Count; i++)
    			{
    				z2.Add(Math.Pow(x[i], y[i]));
    			}
    			b = DateTime.Now;
    			Console.WriteLine((b - a).TotalMilliseconds);
    
    			a = DateTime.Now;
    			TestClass tc1 = new TestClass();
    			var z3 = tc1.TestFun((MWNumericArray)x.ToArray(), (MWNumericArray)y.ToArray()).ToArray();
    			b = DateTime.Now;
    			Console.WriteLine((b - a).TotalMilliseconds);
    
    			a = DateTime.Now;
    			TestClass tc2 = new TestClass();
    			var z4 = tc2.TestFun((MWNumericArray)x.ToArray(), (MWNumericArray)y.ToArray()).ToArray();
    			b = DateTime.Now;
    			Console.WriteLine((b - a).TotalMilliseconds);
    
    			Console.Read();
    

    六(2)、这里我们选择TestMatlabNative.dll这个DLL

    七(2)、输入如下代码

    			List<double> x = new List<double>();
    			List<double> y = new List<double>();
    			List<double> z1 = new List<double>();
    			List<double> z2 = new List<double>();
    			Random random = new Random();
    
    			for (int i = 0; i < 1000000; i++)
    			{
    				x.Add(random.Next(1000) * random.NextDouble());
    				y.Add(random.Next(1000) * random.NextDouble());
    			}
    			DateTime a = DateTime.Now;
    			for (int i = 0; i < x.Count; i++)
    			{
    				z1.Add(Math.Pow(x[i], y[i]));
    			}
    			DateTime b = DateTime.Now;
    			Console.WriteLine((b - a).TotalMilliseconds);
    
    			a = DateTime.Now;
    			for (int i = 0; i < x.Count; i++)
    			{
    				z2.Add(Math.Pow(x[i], y[i]));
    			}
    			b = DateTime.Now;
    			Console.WriteLine((b - a).TotalMilliseconds);
    
    			a = DateTime.Now;
    			TestClass tc1 = new TestClass();
    			var z3 = tc1.TestFun(x.ToArray(), y.ToArray());
    			b = DateTime.Now;
    			Console.WriteLine((b - a).TotalMilliseconds);
    
    			a = DateTime.Now;
    			TestClass tc2 = new TestClass();
    			var z4 = tc2.TestFun(x.ToArray(), y.ToArray());
    			b = DateTime.Now;
    			Console.WriteLine((b - a).TotalMilliseconds);
    
    			Console.Read();
    

    八、修改项目为x64的平台,如果您是x86的系统就不需要修改。

    image

    九、输出结果

    (1)使用MWArray.dll

    image

    直接使用Math.Pow计算x的y次方时间是一致的93ms

    第一次加载Matlab并运算花费了7269ms,第二次使用Matlab运算仅花费62ms

    (2)使用Native.dll

    image

    直接使用Math.Pow计算x的y次方时间是一致的93ms

    第一次加载Matlab并运算花费了7269ms,第二次使用Matlab运算仅花费46ms

    十、总结

    Matlab的计算性能是毋庸置疑滴哇。同时使用Native.dll的性能比使用MWArray.dll的性能要高不少。

    本测试中在使用Native.dll时性能大概是直接C#内部计算器的一倍。

    PS:如果Matlab不能编译,请使用mbuild –setup 和 mex –setup 设置编译器为Visual Studio 。

  • 相关阅读:
    react ts axios 配置跨域
    npm run eject“Remove untracked files, stash or commit any changes, and try again.”错误
    java 进程的参数和list的线程安全
    帆软报表 大屏列表跑马灯效果JS
    帆软报表 快速复用数据集,避免重复劳动
    分析云 OA中部门分级思路和实现方法
    分析云 分段器 只显示一个块的数据
    分析云 更改服务默认的端口号
    分析云U8项目配置方法新版本(2)
    Oracle 创建时间维度表并更新是否工作日字段
  • 原文地址:https://www.cnblogs.com/sorex/p/2617469.html
Copyright © 2011-2022 走看看