.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");

 

posted on 2015-03-28 20:57  老有所依  阅读(287)  评论(0)    收藏  举报

导航