• 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 。

  • 相关阅读:
    Python 更新pip报错:Could not install packages due to an EnvironmentError: [WinError 5] 拒绝访问
    Vs code 配置(1)-win10
    博客园主题--sukura
    log4j
    安装ant问题
    freemarker string= null
    学习随想
    j2ee学习资料收集
    eclipse + marven
    好文mark
  • 原文地址:https://www.cnblogs.com/sorex/p/2617469.html
Copyright © 2020-2023  润新知