Вызов MLApp Matlab. MLAppClass. FEval от F#

Matlab обеспечивает COM-интерфейс, который поддерживает удаленное выполнение произвольных функций (и фрагменты кода). В частности, это имеет метод Feval, который вызывает данную функцию Matlab. Третий параметр к этому методу, pvarArgOut, имеет ВАРИАНТ типа COM* и появляется в Visual Studio редактор F# как аргумент типа:

pvarArgOut: byref<obj>

Следующий код называет interp1, который в Matlab возвращает матрицу (т.е. 2D двойной массив) результат, как нормально для большинства функций Matlab.

let matlab = new MLApp.MLAppClass()

let vector_to_array2d (v : vector) = Array2D.init v.Length 1 (fun i j -> v.[i])

let interp1 (xs : vector) (ys : vector) (xi : vector) =
    let yi : obj = new obj()
    matlab.Feval("interp1", 1, ref yi, vector_to_array2d xs, vector_to_array2d ys, vector_to_array2d xi)
    yi :?> float[,]

Этот код компилирует прекрасный, но при вызове interp1, я получаю COM-исключение:

A first chance exception of type 'System.Reflection.TargetInvocationException' occurred in mscorlib.dll
A first chance exception of type 'System.Runtime.InteropServices.COMException' occurred in mscorlib.dll
An unhandled exception of type 'System.Runtime.InteropServices.COMException' occurred in mscorlib.dll

Additional information: Invalid callee. (Exception from HRESULT: 0x80020010 (DISP_E_BADCALLEE))

Я получаю ту же ошибку, инициализируют ли yi с новым obj, новым Array2D или пустым указателем.

Как F# переводит РАЗЛИЧНЫЕ выходные аргументы?

Обновление

Вот исправленная версия:

let matlab = new MLApp.MLAppClass()

let vector_to_array2d (v : vector) = Array2D.init v.Length 1 (fun i j -> v.[i])

let interp1 (xs : vector) (ys : vector) (xi : vector) =
    let mutable oi : obj = null
    matlab.Feval("interp1", 1, &oi, vector_to_array2d xs, vector_to_array2d ys, vector_to_array2d xi)
    (oi :?> obj[]).[0] :?> float[,]
1
задан Matthew 11 November 2010 в 04:33
поделиться

2 ответа

Вы не хотите ref yi , вы хотите

let mutable yi = new obj()
thatfunc(..., &yi, ...)

, хотя я думаю, что это само по себе не исправит. Может быть, есть образец C # для вызова этого конкретного API?

1
ответ дан 3 September 2019 в 00:35
поделиться

В статье F Sharp и MATLAB на сайте StrangeLights.com описывается использование MATLAB из F # v1.1.5 и F # PowerPack.

Отсутствует шаг - создать dll совместимости с помощью tlbimp, например

tlbimp "c: \ Program Files \ MATLAB \ R2006a \ bin \ win32 \ mlapp.tlb"

, затем в F # импортировать эту dll с

'# r "Interop.MLApp.dll"'

1
ответ дан 3 September 2019 в 00:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: