Взаимодействие с MatLab
От: Andrew_  
Дата: 08.11.04 13:23
Оценка:
Здравствуйте, все.

Помогите, пожалуйста разобраться. Мне надо из программы на С# обратиться к МатЛабу и выполнить там набор преобразований, а затем вернуть данные обратно.

Я подключаю в Reference: Matlab Automation Server Type Library.

И в обработчике например кнопки пишу:


MLApp.MLAppClass V;
Array MReal=Array.CreateInstance(typeof(double),new int[2]{2,4},new int[2]{0,0});
Array MImag=Array.CreateInstance(typeof(double),new int[2]{2,4},new int[2]{0,0});

        
V=new MLApp.MLAppClass();
            
V.Execute("a=[1 2 3 4; 5 6 7 8;];");
V.GetFullMatrix("a","base",ref MReal, ref MImag);
for(int i=0; i<2; i++)
  for(int j=0; j<4; j++)
    lbx.Items.Add(i.ToString()+":"+j.ToString()+" - "+MReal.GetValue(i,j).ToString());
V.Quit();


И в процессе работы всегда возникает ошибка на строчке V.Execute(...);


An unhandled exception of type 'System.InvalidCastException' occurred in mscorlib.dll
Additional information: QueryInterface for interface MLApp.DIMLApp failed.


Помогите, пожалуйста, кто знает в чем дело.
Андрей.
Re: Взаимодействие с MatLab
От: vdimas Россия  
Дата: 09.11.04 01:08
Оценка:
- не используй automation для доступа к матлабу
— используй нативный С-интерфейс
— напиши промежуточную сборку на МС++, которая будет клеем м/у дотнетом и С-интерфейсом матлаба.
Re: Взаимодействие с MatLab
От: Аноним  
Дата: 16.11.04 06:58
Оценка:
пардон за оффтоп:
а где можно почитать об использовании матлабовских ф-ий из под .нета ?

Автор благодарит русский алфавит за предоставленные буквы.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: Взаимодействие с MatLab
От: ENull Россия  
Дата: 16.11.04 07:22
Оценка:
Используй позднее связывание. Там DISPID у методов, кажется, перепутаны.
Re[2]: Взаимодействие с MatLab
От: Andrew_  
Дата: 16.11.04 08:20
Оценка:
Всем спасибо за внимание к проблеме.

Действительно она решилась после написания простенького класса правда на VB.Net (в Матлабе оказывается был пример по программированию с испорльзованием VB ).

Всем кому интересно привожу текст единственного класса промежуточной библиотеки для взаимодействия с Матлабом.


Public Class cMatlab
    Dim MatLab As Object

    Public Sub InitializeA()
        MatLab = CreateObject("Matlab.Application")
    End Sub

    Public Sub FinalA()
        Call MatLab.Quit()
    End Sub

    Public Sub GetFullMatrixA(ByVal a As String, ByVal bs As String, ByRef pr As Double(,), ByRef pi As Double(,))
        Call MatLab.GetFullMatrix(a, bs, pr, pi)
    End Sub

    Public Sub PutFullMatrixA(ByVal a As String, ByVal bs As String, ByRef pr As Double(,), ByRef pi As Double(,))
        Call MatLab.PutFullMatrix(a, bs, pr, pi)
    End Sub

    Public Function ExecuteA(ByVal name As String) As String
        ExecuteA = MatLab.Execute(name)
    End Function
End Class


Для вызова надо подключить получившуюся сборку и где-нибудь в обработчике события написать что-то типа:

    mt_class.cMatlab V=new mt_class.cMatlab();
    double[,] MReal=new double[2, 4];
    double[,] MImag=new double[1, 1];
    V.InitializeA(); // инициализация и связь с матлабом
        // в этом методе можно писать любое выражение, как это делается в матлабовских M-файлах
    V.ExecuteA("surf(peaks)");
    V.ExecuteA("a = [1 2 3 4; 5 6 7 8;]");
    // Возвращает двумерный массив из Матлаба в программу
        V.GetFullMatrixA("a","base", ref MReal, ref MImag);


Вроде все работает.
Андрей.
Re: Взаимодействие с MatLab
От: slavall  
Дата: 30.05.06 10:18
Оценка:
Это баг MatLab. Надо создать .reg файл, следующего содержания:




Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Interface\{669CEC93-6E22-11CF-A4D6-00A024583C19}]
@="DIMLApp"

[HKEY_CLASSES_ROOT\Interface\{669CEC93-6E22-11CF-A4D6-00A024583C19}\ProxyStubClsid]
@="{00020420-0000-0000-C000-000000000046}"

[HKEY_CLASSES_ROOT\Interface\{669CEC93-6E22-11CF-A4D6-00A024583C19}\ProxyStubClsid32]
@="{00020420-0000-0000-C000-000000000046}"

[HKEY_CLASSES_ROOT\Interface\{669CEC93-6E22-11CF-A4D6-00A024583C19}\TypeLib]
@="{C36E46AB-6A81-457B-9F91-A7719A06287F}"
"Version"="1.0"




и выполнить его.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.