[C#]매틀랩과 닷넷 C# 연결하기(Connect Matlab to .NET C#)


매틀랩과 C 혹은 C++ 과 연결하는 방법에 대해서 이미 다른 블로거 분들이 올렸는데, 실질적으로 .NET 라이브러리화되어서 연동시켜서 매틀랩의 함수들을 사용하는 방식에 대해서는 안 나와 있어서 이렇게 올리게 되었습니다. 일단. 아래의 링크에 가셔서 기본적인 절차를 숙지 하셔야 합니다. 



Matlab Builder NE를 이용하라!!
.NET용 DLL을 만들어서 C#과 연결하기 위해서는 아래화면에서 Matlab Compiler가 아니라 Matlab Builder NE를 사용해야만 만들수 있습니다. 그래서 Matlab Builder NE를 누르시면 아래와 같은 화면이 뜨게 됩니다. 


matalb deploytool


이 화면에서 .Net Component를 누르시고 진행하시면 됩니다. 진행후에는 만들려고 했던 매틀랩의 Function이 dll화 되어서 나오게 되고 distrib src 두 폴더로 나뉘어서 제공이 됩니다. 

Dll 참조추가후, 어떻게 사용해야하는거지?
단순히 dll을 참조추가해서 쓰려면 distribi 폴더 안에 "이름.dll" 파일을 사용하면됩니다. dll 파일외에 "이름Native.dll"도 있는데 신경쓰지 말고 dll 파일만 참조추가 하면 됩니다. 


참조추가후 wd 라는 객체를 만들어서 whoisest 이라는 함수를 불러오는 과정을 위의 그림에서 볼수가 있습니다. 근데 이상한 점이 있죠? MWArray라는 것은 무엇일까요?

매틀랩을 연동했다고 해서, 일단 C#에서 쓰는 자료형으로 매틀랩의 함수에 데이터를 전달해 줄수있는것이 아닙니다. 물론 자신이 만든 매틀랩 함수는 가능하지만, 그 외의 필터 등의 매틀랩에 있는 함수를 사용할때는 MWArray 를 사용해야 하는 경우가 있습니다. 

MWArray를 쓰려면?
MWArray를 사용하기 위해서는 매틀랩이 깔려 있거나 혹은 Matlab Compiler를 설치하셔야만 합니다.  

MathWorks .NET MwArrayAPI


위의 파일을 참조추가 한후에는, MWArray 클래스를 이용해서 데이터를 매틀랩 함수로 전달 할 수 있습니다. 하지만, MwArray 자체를 객체로 만들어서 보낼수는 없습니다. 즉, 하위 클래스를 이용해야 한다는 것이죠. 

예제 코드를 볼까요?
 public MWArray[] Mathlab_Detcoef(double[] cxd, int[] lxd, int p)
 {

            MWNumericArray ccxd_mwn = new MWNumericArray(cxd.Length, 1, cxd);

            MWNumericArray iixd_mwn = new MWNumericArray(lxd.Length, 1, lxd);

            MWArray[] result = wd.detcoef(1, ccxd_mwn, iixd_mwn, p);

            return result;
  }


위의 코드를 보면, MWNumericArray를 통해서 double형 배열과 int형 배열을 각각 매틀랩에 알맞는 형식으로 변환해 주고 있습니다. c#에서의 배열을 그대로 쓰기에는 매틀랩 함수에는 무리가 있기때문에 위와 같이 처리한 것입니다. 그리고 detcoef 함수를 호출하기 위해서 MWNumericArray 객체 두개를 각각 인자로 넣어주고 MWArray 배열 형식으로 받아와서 처리하고 있습니다. 

참조추가를 한 후에는, MWNumericArray 이외의 MWCellArray, MWCharArray 등의 다양한 형태의 Array를 사용할수 있으니 한번 찾아 보시길 바랍니다. 


참고 사항
C#으로 매틀랩을 가져오긴 했지만, 매틀랩에서는 인덱스가 0 이 아닌 1부터 시작한다는 것을 반드시 명심하시기 바랍니다. 또한, 1차원 배열도 2차원 형식으로 표현해야 하는 경우가 있으니 유념하시기 바랍니다. 


저작자 표시 비영리 변경 금지
Technique/C/C++/C# 2010/02/05 18:51
Trackback 1 : 댓글을 오로지 페이스북으로만.