C#與MATLAB之間傳遞參數


本文轉載自http://www.cr173.com/html/10249_1.html

MWNumericArray是MWArray和c#中數據的中間類,怎么用?怎樣在C參數?

a.double型、int型等數值類型的變量傳遞

MWNumericArray i = null, result = mydouble; 

i=4; 

myClass myclass = new myClass(); //實例化 
result = (MWNumericArray)myclass.myfunc(i); 

b.字符串(需要用到MWCharArray和MWArray轉換
MWCharArray FileName = myString; 
MWNumericArray sensitivity; 
sensitivity = (MWNumericArray)myClass.myAlgorithm((MWArray)

c.多個輸出參數組成的數組 
MWNumericArray out_Arr = (MWNumericArray)out_Args[1]; //取的數組(matlab返回的數組下界是從1開始的) 
取出數組中的一個元素值 
mydouble=out_Arr[i].ToScalarDouble(); 
如上面例子ToScalarDouble一類的toXXXX等方法還有許多。 

d.result.toArray可以把matlab返回的矩陣變成C#的n x m數組,eg: 
double[,] csArray= (double[,])result.ToArray(MWArrayComponent

e.將數組傳入Matlab(和傳遞單個數值的方法一樣
double[,] dbx = new double[2, 2] { { 1, 2 }, { 3, 4 } }; 
MWNumericArray x=dbx; 
myclass.picture(x); 
________________________________________ 

M文件如何接收和返回? 
function x=test(h,d) //接收兩個參數,返回一個 
function [x1,x2]=test(h,d) //返回數組 
________________________________________ 
以上為.Net方式連接,以下為COM方式連接(編譯速度而言.net的方式要快上很多,而且似乎比較穩定) 
matlab編譯工作 
- mbuild -setup 
- deploytool,Matlab Builder for .net,Generic COM Component 
- 添加m函數文件(eg: myfunc.m),改類名(eg: myComClass),build 
注冊dll 
regsvr32 myCom.dll 
regsvr32 mwcomutil.dll 
VS2005調用: 
- Reference加Com控件 
- 調用示例 
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返回的兩個參數並轉化為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;];

另一篇: 
以下是本人編程中總結的一些思路,拿出來與大家共享。不對之處,請留言說明。 
版本:Matlab R2007b ,Visual Studio 2005 
C++/C#數據類型到M類型 
此方向轉換十分簡單。 
如果C++/C#數據不是數組, 
• 直接將值傳遞給已經初始化的MWArray數組中的成員 
• 直接將數據類型賦值給已經初始化的MWNumericArray變量。 
• 直接將字符串類賦值給已經初始化的MWCharArray變量。 
如果是數組類型: 
• 直接賦值給MWNumericArray變量; 
• 賦值給MWArray變量,則在前面加上類型轉換如:(MWNumericArray)進行強制轉換。 
總之,MWArray是總類型,其它的以MW開頭,以Array結尾的變量類型都可以直接對它進行賦值或取值。 
M類型到C++/C#數據類型 
MWArray 
M類型,它是M文件的編譯后內部的標准類型,一切C++/C#類型都要最終轉換成此類型,方可作為參數調用M語言函數。 
MWCharArray 
M的字符串類型,使用它可以將M中的字符類型轉換成C++/C#的字符串類型。 
MWNumericArray 
MWNumericArray是MWArray與C#等語言的轉換中間類型。 
常用的轉換函數: 
① public Array ToArray(MWArrayComponent component); 
M類型轉換成C#的Array類型,然后可以直接轉換成其它類型的數組。 
② public byte ToScalarByte(); 
M類型轉換成C#的字節類型; 
③ public double ToScalarDouble(); 
M類型轉換成C#的雙精度類型; 
double temp = ((MWNumericArray)(mwArgout[0])).ToScalarDouble(); 
④ public float ToScalarFloat(); 
M類型轉換成C#的單精度類型; 
⑤ public int ToScalarInteger(); 
M類型轉換成C#的整型類型; 
⑥ public long ToScalarLong(); 
M類型轉換成C#的長整C/C++/C#數據型類型; 
⑦ public short ToScalarShort(); 
M類型轉換成C#的短整型類型; 
⑧ public override string ToString(); 
M類型轉換成C#的字符串類型;string arror = mwArgout[2].ToString(); 
⑨ public Array ToVector(MWArrayComponent component); 
M類型轉換成C#的Array類型,然后可以直接轉換成其它類型的數組。 
下面使用調試過的代碼示例表述①⑨兩個函數的區別: 
 
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); 
從以上代碼可以看出:函數①得到了二維數組,而⑨則是得到了一維數組。轉換成C++/C#數據類型后,它們的維數均為從0開始。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM