C#中使用MATLAB
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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
四、添加⼀个Class,然后将上⾯我们新建的⽂件放进去。
五、点击编译
六(1)、在项⽬⽬录中可以看到distrib和src⽂件夹,这⾥我们直接将TestMatlab.dll引⽤到项⽬中。
另外再添加MWArray.dll如下图所⽰
七(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的系统就不需要修改。
九、输出结果
(1)使⽤MWArray.dll
直接使⽤Math.Pow计算x的y次⽅时间是⼀致的93ms,
第⼀次加载Matlab并运算花费了7269ms,第⼆次使⽤Matlab运算仅花费62ms。
(2)使⽤Native.dll
直接使⽤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 。