实现类型安全接口和集成到. net应用程序中
这个例子展示了如何实现一个类型安全接口,并将其集成到. net应用程序。
类型安全接口允许您工作直接与熟悉的本地数据类型,而不是使用MWArray
API。添加一个类型安全接口net程序集创建一个额外的方法,接受和返回本地。net类型。
编写和测试你的MATLAB代码
创建您的MATLAB®程序,然后测试代码之前实现类型安全接口。MATLAB程序必须匹配的函数声明的母语。net接口。
对于这个示例,将下面的代码保存为multiply.m
。函数返回输入的乘法x
和y
。
函数z =相乘(x, y) z = x * y;
测试函数在MATLAB命令提示符。
乘([1 4 7;2 5 8;3 6 9],[1 4 7;2 5 8;3 6 9])
ans 42 = 36 66 102 81 126 96 150
实现类型安全接口
MATLAB代码编写和测试后,开发. net c#或Visual Basic类型安全接口®。这个示例使用c#源代码提供接口。
开放微软®Visual Studio®并创建一个新类库(。净框架)项目命名
IMultiply
。在解决方案资源管理器窗口中,重命名
Class1.cs
文件IMultiply.cs
。在该文件内,您写的源代码访问组件的类型安全接口。在这个例子中,
IMultiply
接口是用c#写的,指定三过载乘
:使用系统;公共接口IMultiply{/ /标量乘法系统。乘(系统的两倍。双x,系统。双y);/ /向量乘以一个标量,返回一个向量系统。双[]相乘(系统。双x[],系统。双y);/ /系统矩阵乘法。双[,]相乘(系统。双[,]x,系统。双[,]y);}
接口中的每个方法必须精确匹配一个部署MATLAB函数。
有两个输入和一个输出(所有方法与MATLAB相匹配
乘
功能),但参数的数据类型不同。去构建然后配置管理器,改变的平台任何CPU来x64。
建设项目微软Visual Studio。
该文件
IMultiply.dll
在构建生成文件夹。
这个示例假设您的程序集仅包含IMultiply
。实际上,更可能的是类型安全接口已经编译好的程序集的一部分。大会可以编译之前编写的MATLAB函数。
使用图书馆创建net程序集编译器应用程序
生成与. net程序集使用类型安全接口库的编译器应用。另外,如果你想创建一个. net汇编的MATLAB命令窗口使用编程方法,明白了使用compiler.build.dotNETAssembly创建net程序集。
创建一个库编译器项目并选择net程序集从类型列表。
指定以下值:
场 价值 库名称 乘
类名 算术
文件编制 multiply.m
扩大额外的运行时设置部分。
在类型安全的API部分,请执行以下操作:
选择使类型安全API。
在界面组装字段中,指定的位置类型安全接口组装
IMultiply.dll
你建造。选择
IMultiply
接口的net的界面下拉框。离开名称空间字段空白。
指定
算术
类的包装类字段。
单击包按钮来构建项目。
创建net程序集使用compiler.build.dotNETAssembly
作为替代库的编译器应用程序,您可以使用编程方法生成类型安全接口使用以下步骤。如果您已经创建了一个装配使用库的编译器,请参阅net程序集集成到。net应用程序。
构建. net程序集使用
compiler.build.dotNETAssembly
函数。使用名称-值参数来指定程序集名称和类名。compiler.build.dotNETAssembly (“multiply.m”,…“AssemblyName”,“乘”,…“名称”,“算术”);
导航到生成的
MultiplydotNETAssembly
文件夹中。通过使用生成类型安全接口
ntswrap
从MATLAB命令:ntswrap (“c”,“Multiply.Arithmetic”,…“——”,“IMultiply.dll”,…“我”,“IMultiply”);
并不是所有的参数都是互相兼容。看到
ntswrap
有关所有的命令选项。提示
如果
IMultiply.dll
大会不是在当前文件夹,指定完整路径。这个命令生成装配
ArithmeticIMultiply.dll
包含的类型安全的APIMATLAB编译器SDK™类算术
的命名空间MultiplyNative
。
net程序集集成到。net应用程序
创建您的. net汇编后,您可以将其集成到任何。net应用程序。您可以使用这个例子。net应用程序代码作为指导编写自己的. net应用程序。
编译使用。net程序微软Visual Studio通过以下步骤:
开放微软Visual Studio并创建一个c#控制台应用程序(。净框架)被称为
MultiplyApp
。将以下代码复制到生成的
Program.cs
在你的项目:使用系统;使用System.Collections.Generic;使用来;使用text;名称空间MultiplyApp{类程序{代表字符串VectorToString < T > (IEnumerable < T > v);委托IEnumerable <字符串> MatrixToString < T > (T [,] m);静态void Main (string [] args){控制台。WriteLine (“\ nStarting应用…\ n”);/ /创建一个实例的类型安全API IMultiply m =新ArithmeticIMultiply ();/ /标量乘法双x = 17, y = 3.14159;双z = m。乘(x, y); System.Console.WriteLine("{0} * {1} = {2}\n", x, y, z); // Vector times scalar double[] v = new double[] { 2.5, 81, 64 }; double s = 11; double[] d = m.multiply(v, s); VectorToString
vec2str = (vec => vec.Select(n => n.ToString()).Aggregate((str, next) => str + " " + next)); System.Console.WriteLine("[ {0} ] * {1} = [ {2} ]\n", vec2str(v), s, vec2str(d)); // Matrix multiplication double[,] magic = new double[,]{ // 3x3 magic square { 8, 1, 6 }, { 3, 5, 7 }, { 4, 9, 2 } }; double[,] squareSquared = m.multiply(magic, magic); MatrixToString mat2str = mat => mat.EnumerateRows ().Select(r => vec2str(r)); PrintParallel(mat2str(magic), " * ".Select(c => c.ToString()), mat2str(magic), " = ".Select(c => c.ToString()), mat2str(squareSquared)); Console.WriteLine("\nClosing application..."); } public static void PrintParallel (params IEnumerable [] sources) { int max = sources.Select(s => s.Count()).Max(); for (int i = 0; i < max; i++) { foreach (var src in sources) System.Console.Write("{0} ", src.ElementAt(i)); System.Console.WriteLine(); } } } public static class ArrayExtensions { public static IEnumerable > EnumerateRows (this Array a) { return Enumerable.Range(0, a.GetLength(1)).Select(row => a.ToIEnumerable ().Skip(row * a.GetLength(0)).Take(a.GetLength(0))); } public static IEnumerable ToIEnumerable (this Array a) { foreach (var item in a) yield return (T)item; } } } 在项目中添加引用下面的文件。
这个引用: 定义: IMultiply.dll
. net原生类型界面组装 IMultiply
ArithmeticIMultiply.dll
生成的类型安全的API MultiplyNative.dll
生成的. net汇编 请注意
不像其他。net部署场景,您不需要参考
MWArray.dll
在服务器程序源代码。的MWArray
数据类型是类型安全的API背后隐藏着的ArithmeticIMultiply
。去构建然后配置管理器,改变的平台任何CPU来x64。
编译并运行这个程序微软Visual Studio。
程序显示以下输出:
启动应用程序…17 * 3.14159 = 53.40703(2.5 81 64)* 11 =[27.5 891 704]8 1 6 8 1 6 91 67 67 3 5 7 * 3 5 7 = 67 91 67 4 9 2 4 9 2 67 67 91关闭应用程序…
提示
在MATLAB函数声明输出出现在输入。例如,在
乘
函数,输出z
出现在输入x
和y
。这个订单不需要。net接口功能。输入之前或之后可能会出现输出,或两个可能是混合在一起。MATLAB编译器SDK匹配。net接口函数公共MATLAB函数通过函数名和参数计算。在
乘
例子,. net接口函数和MATLAB函数必须命名乘
,函数必须有相同数量的参数定义。输入和输出参数的数量和相对顺序是至关重要的。
在评估参数的顺序,只有像参数(输入或输出)的顺序是,不管他们在哪里出现在参数列表中。
一个函数的输入接口可能少于其相应的MATLAB函数,而不是更多。
参数映射发生根据参数顺序而不是参数名称。
函数返回值,如果指定了,算是第一个输出。
你必须使用
出
对多个输出参数。交替,
裁判
参数可用于出
,因为裁判
和出
是同义的。
MATLAB不支持重载函数。万博1manbetx因此,所有用户提供的函数的过载与给定的名称映射到生成的一个函数MATLAB编译器SDK。
看到MATLAB类型。net类型完整的指导方针管理数据转换与类型安全接口。
另请参阅
compiler.build.dotNETAssembly
|ntswrap