C#與MATLAB之間傳遞參數(shù)
MWNumericArray是MWArray和c#中數(shù)據(jù)的中間類(lèi), 怎么用?怎樣在C參數(shù)?
a.double型、int型等數(shù)值類(lèi)型的變量傳遞
MWNumericArray i = null, result = mydouble;
i=4;
myClass myclass = new myClass(); //實(shí)例化
result = (MWNumericArray)myclass.myfunc(i);
b.字符串(需要用到MWCharArray和MWArray轉(zhuǎn)換)
MWCharArray FileName = myString;
MWNumericArray sensitivity;
sensitivity = (MWNumericArray)myClass.myAlgorithm((MWArray)
c.多個(gè)輸出參數(shù)組成的數(shù)組
MWNumericArray out_Arr = (MWNumericArray)out_Args[1]; //取的數(shù)組(matlab返回的數(shù)組下界是從1開(kāi)始的)
取出數(shù)組中的一個(gè)元素值
mydouble=out_Arr[i].ToScalarDouble();
如上面例子ToScalarDouble一類(lèi)的toXXXX等方法還有許多。
d.result.toArray可以把matlab返回的矩陣變成C#的n x m數(shù)組,eg:
double[,] csArray= (double[,])result.ToArray(MWArrayComponent
e.將數(shù)組傳入Matlab(和傳遞單個(gè)數(shù)值的方法一樣)
double[,] dbx = new double[2, 2] { { 1, 2 }, { 3, 4 } };
MWNumericArray x=dbx;
myclass.picture(x);
________________________________________
M文件如何接收和返回?
function x=test(h,d) //接收兩個(gè)參數(shù),返回一個(gè)
function [x1,x2]=test(h,d) //返回?cái)?shù)組
________________________________________
以上為.Net方式連接,以下為COM方式連接(編譯速度而言.net的方式要快上很多,而且似乎比較穩(wěn)定)
matlab編譯工作
- mbuild -setup
- deploytool,Matlab Builder for .net,Generic COM Component
- 添加m函數(shù)文件(eg: myfunc.m),改類(lèi)名(eg: myComClass),build
注冊(cè)dll
regsvr32 myCom.dll
regsvr32 mwcomutil.dll
VS2005調(diào)用:
- Reference加Com控件
- 調(diào)用示例
double[,] arr = null;
object in_a, out_a;
in_a = 500;
out_a = arr1;
myCom.myComClass mc = new myCom.myComClass();
mc.myfunc(1, ref out_a, in_a);
________________________________________
小例子:(提取matlab返回的兩個(gè)參數(shù)并轉(zhuǎn)化為C#的矩陣)
Code
testz.testzclass st = new testz.testzclass();
MWArray[] max = st.testz(2);
MWNumericArray x1 = (MWNumericArray)max[0];
MWNumericArray x2 = (MWNumericArray)max[1];
double[,] location1 = (double[,])x1.ToArray(MWArrayComponent.Real);
double[,] location2 = (double[,])x2.ToArray(MWArrayComponent.Real);
label1.Text = location1[1,2].ToString();
其中的M文件:
Code
function [x1,x2]=testz()
x1=[1 2 3;
4 5 6;
7 8 9;];
x2=[9 8 7;
6 5 4;
3 2 1;];
另一篇:
以下是本人編程中總結(jié)的一些思路,拿出來(lái)與大家共享。不對(duì)之處,請(qǐng)留言說(shuō)明。
版本:Matlab R2007b ,Visual Studio 2005
C++/C#數(shù)據(jù)類(lèi)型到M類(lèi)型
此方向轉(zhuǎn)換十分簡(jiǎn)單。
如果C++/C#數(shù)據(jù)不是數(shù)組,
• 直接將值傳遞給已經(jīng)初始化的MWArray數(shù)組中的成員
• 直接將數(shù)據(jù)類(lèi)型賦值給已經(jīng)初始化的MWNumericArray變量。
• 直接將字符串類(lèi)賦值給已經(jīng)初始化的MWCharArray變量。
如果是數(shù)組類(lèi)型:
• 直接賦值給MWNumericArray變量;
• 賦值給MWArray變量,則在前面加上類(lèi)型轉(zhuǎn)換如:(MWNumericArray)進(jìn)行強(qiáng)制轉(zhuǎn)換。
總之,MWArray是總類(lèi)型,其它的以MW開(kāi)頭,以Array結(jié)尾的變量類(lèi)型都可以直接對(duì)它進(jìn)行賦值或取值。
M類(lèi)型到C++/C#數(shù)據(jù)類(lèi)型
MWArray
M類(lèi)型,它是M文件的編譯后內(nèi)部的標(biāo)準(zhǔn)類(lèi)型,一切C++/C#類(lèi)型都要最終轉(zhuǎn)換成此類(lèi)型,方可作為參數(shù)調(diào)用M語(yǔ)言函數(shù)。
MWCharArray
M的字符串類(lèi)型,使用它可以將M中的字符類(lèi)型轉(zhuǎn)換成C++/C#的字符串類(lèi)型。
MWNumericArray
MWNumericArray是MWArray與C#等語(yǔ)言的轉(zhuǎn)換中間類(lèi)型。
常用的轉(zhuǎn)換函數(shù):
① public Array ToArray(MWArrayComponent component);
將M類(lèi)型轉(zhuǎn)換成C#的Array類(lèi)型,然后可以直接轉(zhuǎn)換成其它類(lèi)型的數(shù)組。
② public byte ToScalarByte();
將M類(lèi)型轉(zhuǎn)換成C#的字節(jié)類(lèi)型;
③ public double ToScalarDouble();
將M類(lèi)型轉(zhuǎn)換成C#的雙精度類(lèi)型;
double temp = ((MWNumericArray)(mwArgout[0])).ToScalarDouble();
④ public float ToScalarFloat();
將M類(lèi)型轉(zhuǎn)換成C#的單精度類(lèi)型;
⑤ public int ToScalarInteger();
將M類(lèi)型轉(zhuǎn)換成C#的整型類(lèi)型;
⑥ public long ToScalarLong();
將M類(lèi)型轉(zhuǎn)換成C#的長(zhǎng)整C/C++/C#數(shù)據(jù)型類(lèi)型;
⑦ public short ToScalarShort();
將M類(lèi)型轉(zhuǎn)換成C#的短整型類(lèi)型;
⑧ public override string ToString();
將M類(lèi)型轉(zhuǎn)換成C#的字符串類(lèi)型;string arror = mwArgout[2].ToString();
⑨ public Array ToVector(MWArrayComponent component);
將M類(lèi)型轉(zhuǎn)換成C#的Array類(lèi)型,然后可以直接轉(zhuǎn)換成其它類(lèi)型的數(shù)組。
下面使用調(diào)試過(guò)的代碼示例表述①⑨兩個(gè)函數(shù)的區(qū)別:
①
double[,] Temp1 = new double[1,3];
Temp1=
(double[,])((MWNumericArray)mwArgout[1]).ToArray(MWArrayComponent.Real);
⑨
double[] s1 = new double[2];
s1 =
(double[])((MWNumericArray)mwArgout[1]).ToVector(MWArrayComponent.Real);
從以上代碼可以看出:函數(shù)①得到了二維數(shù)組,而⑨則是得到了一維數(shù)組。轉(zhuǎn)換成C++/C#數(shù)據(jù)類(lèi)型后,它們的維數(shù)均為從0開(kāi)始。