参考:http://www.cnblogs.com/arxive/p/6336756.html和http://www.itkeyword.com/doc/6726287639438354x339/c#-matlab
生成dll文件
准备好要打包的函数(m文件)
function [result,m,n] = GetSelfMultiplyResult(list)
% 计算 矩阵与其转置矩阵的乘积
% 测试返回多个结果
result = list*list';
[m,n] = size(result);
end
function result = GetSelfSquareResult(list)
% 计算 矩阵各元素平方后的结果
result = list.^2;
end
在生成的文件中,找到“for_redistribution_files_only”文件夹,里面有
CalcMatResult.dll CalcMatResultNative.dll 两个dll文件,均可使用。
另外,MWArray.dll 在matlab安装目录中,参考路径:
X:\Program Files\MATLAB\R2015b\toolbox\dotnetbuilder\bin\win64\v2.0\
向工程中引入dll
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MathWorks.MATLAB.NET.Arrays;
using GetSelfMultiplyResultNative;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int[,] list = { { 1 }, { 2 }, { 3 }, { 4 } }; //列向量
MWNumericArray arr = new MWNumericArray(list);//c#数据类型转换为matlab常用的数据类型
GetSelfMultiplyResultNative.Multiply multi = new Multiply();
object resultObj = multi.GetSelfMultiplyResult(3, arr);// 3 表示返回的结果数量,要小于等于matlab对应函数实际的返回值数量
object[] resultObjs = (object[])resultObj;
double[,] calcResult = (double[,])resultObjs[0];
double sizem = (double)resultObjs[1];
double sizen = (double)resultObjs[2];
Console.ReadKey();
}
}
}
**
知识背景
C#中常用的基本类型有int、double、string、bool、Byte等,matlab中的基本类型有double、single、int32、char、struct等等。
C#里面的数据类型就算是和matlab里面的名字相同也是无法直接使用的。因为在Matlab中基本上都是以矩阵的形式来组织数据,和C#中对于数据的处理方式完全不同。两者的互通必须通过MWArray这个类。MWArray是MathWorks公司是为其他语言调用matlab编译的dll设计出的一种数据类型。它本身是抽象类,并且它是MWNumericArray、MWLogicalArray、MWCharArray、MWStructArray和MWCellArray的基类(除了MWIndexArray,MWIndexArray本身也是抽象类)。
注意事项
(一) MWNumericArray arr=new int[]{1,2,3,4};
或其他方法给MWNumericArray对象初始话会报错:“MathWorks.MATLAB.NET.Arrays.MWNumericArray”的类型初始值设定项引发异常。
解决办法:将.net版本切换成4.0(client profile也可以) (右键单击项目选择属性可以切换版本)。其实我试了很多其他的方法没用,对大家可能有帮助吧,这是其他人的解决方案。
1.引用dll的时候出错了,注意加入的不是src下的dll而是distrib下面的dll,这个就是我出现的错误
2.一定要加入MWArray.dll在matlab的安装路径下D:\Program Files\MATLAB\R2008a\toolbox\dotnetbuilder\bin\win32\v2.0
3.记得安装MCRinstaller.exe,它的位置在matlab安装目录下toolbox\compiler\deploy\win32\MCRInstaller.exe
4.注册,我们可以在其他编辑器下可以对其进行调用在cmd下进入matlab下的 bin/win32的目录下,输入regsvr32 mwcomutil.dll 注意32后面还要一个空格。)
(二) 在多维数组的使用过程中经常会发现有的数据不需要填充或者数据有错误怎么办?
解决办法:最好是在matlab函数开发过程中就约定好这类的数据使用什么来替代。假设接收的参数是不限制数据类型的,比如MWCellArray,那么可以使用null或者NAN等常见的符号来表示;假设matlab函数要求传入的是纯数字类型,比如MWNumericArray,可以使用“负无穷大”来表示,matlab和c#(double.NegativeInfinity)中都可以直接识别,易用性较好。 参考资料 MWArrayAPI HELP Matlab中文论坛。