.net 调用scilab 示例(转)
转自:http://blog.csdn.net/hu516/article/details/6460871
dll位于 安装目录/scilab-5.3.2/modules/call_scilab/examples/call_scilab/NET/C#/dotnetsci/obj/Debug/DotNet-Component-Scilab.dll
若没有dll,则打开 安装目录/scilab-5.3.2/modules/call_scilab/examples/call_scilab/NET/C#/DotNetScilab.sln生成一下
using DotNetScilab; Scilab _objScilab = new Scilab(true);//调用Scilab引擎,ture表示带有启用 TCL/TK and Java 图形界面,能发送plot等图形函数,缺省则为禁用 //==================================================================== double[] A = new double[] { 1, 2, 3, 4, 5, 6 }; int mA = 2, nA = 3; _objScilab.createNamedMatrixOfDouble("AA", mA, nA, A);//将double数组A发送至Scilab引擎,并命名为AA,这个比较bt,必须将double[,]数组转为double[]数组然后再传 _objScilab.SendScilabJob("B = AA + 1;");//最nb的用法,可以向Scilab引擎发送Scilab命令行,可以像在Scilab一样调用Scilab工具箱以及Scilab中所有能用到的函数,需要注意的是SendScilabJob有返回值,且返回值为0时才表示代码成功发送且执行 int[] DimB = _objScilab.getNamedVarDimension("B");//获取Scilab引擎中double数组B的维数,B不存在时为null; double[] B = _objScilab.readNamedMatrixOfDouble("B");//获取Scilab引擎中double数组B,尼玛就不能把数组转成double[,]的啊!!! _objScilab.SendScilabJob("plot3d()");//调用Scilab图形界面,哈哈,I like this _objScilab.SendScilabJob("xs2gif(gcf(),'D://3d.gif');");//而且可以把图形保存哦
以上为double数组的调用,其他类型的组调用方法类似
对于createNamedMatrixOfDouble和readNamedMatrixOfDouble两个方法只能对一维double数组double[]进行操作,在应用中需在double[]与double[,]间进行互转,极其不方便,写了4个方法,对此进行简化:
/// <summary> /// 一维数组改二维数组 /// </summary> /// <param name="Vector"></param> /// <param name="iRows"></param> /// <param name="iCols"></param> /// <returns></returns> public double[,] myVector2Matrix(double[] Vector, int iRows, int iCols) { double[,] Matrix = new double[iRows, iCols]; for (int i = 0; i < iRows; i++) { for (int j = 0; j < iCols; j++) { Matrix[i, j] = Vector[i + j * iRows]; } } return Matrix; } //=============================================================================== /// <summary> /// 二维数组改一维数组 /// </summary> /// <param name="Matrix"></param> /// <returns></returns> public double[] myMatrix2Vector(double[,] Matrix) { int n=Matrix.GetLength(0); int m=Matrix.GetLength(1); double[] Vector = new double[n * m]; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { Vector[i + j * n] = Matrix[i, j]; } } return Vector; } //=============================================================================== /// <summary> /// 将二维double数组发送至Scilab引擎 /// </summary> /// <param name="matrixName"></param> /// <param name="matrixDouble"></param> /// <returns></returns> public int mycreateNamedMatrixOfDouble(string matrixName, double[,] matrixDouble) { int iRows = matrixDouble.GetLength(0); int iCols = matrixDouble.GetLength(1); double[] vectorDouble = myMatrix2Vector(matrixDouble); System.IntPtr ptrEmpty = new System.IntPtr(); Scilab_cs_wrapper.api_Err SciErr = Scilab_cs_wrapper.createNamedMatrixOfDouble(ptrEmpty, matrixName, iRows, iCols, vectorDouble); return SciErr.iErr; } //=============================================================================== /// <summary> /// 从Scilab引擎读取二维double数组 /// </summary> /// <param name="matrixName"></param> /// <returns></returns> public unsafe double[,] myreadNamedMatrixOfDouble(string matrixName) { int iRows = 0; int iCols = 0; System.IntPtr ptrEmpty = new System.IntPtr(); Scilab_cs_wrapper.api_Err SciErr = Scilab_cs_wrapper.readNamedMatrixOfDouble(ptrEmpty, matrixName, &iRows, &iCols, null); if (iRows * iCols > 0) { double[] vectorDouble = new double[iRows * iCols]; // get values in matrixDouble SciErr = Scilab_cs_wrapper.readNamedMatrixOfDouble(ptrEmpty, matrixName, &iRows, &iCols, vectorDouble); if (SciErr.iErr != 0) return null; double[,] matrixDouble = myVector2Matrix(vectorDouble, iRows, iCols); return matrixDouble; } return null; }
调用示例:
double[] A = new double[] { 1, 2, 3, 4, 5, 6 }; int mA = 2, nA = 3; double[,] a = _objScilab.myVector2Matrix(A, 2, 3); double[] A1 = _objScilab.myMatrix2Vector(a); _objScilab.mycreateNamedMatrixOfDouble("AA", a); double[,] d = _objScilab.myreadNamedMatrixOfDouble("AA");
浙公网安备 33010602011771号