У меня были проблемы с интерфейсом Matlab с COM-объектом. Я создал COM-объект так:
myobj = actxserver('Example_ProgID')
% where 'Example_ProgID is what is registered in the Windows Registry
Проблем пока нет. Однако мне нужно было вызвать метод (т.е. функцию) этого объекта и передать ему целочисленный массив в качестве входного параметра, например так:
x = [2,7,5]; y = myobj.myfunc(x);
Однако я получил следующие ошибки
Error: Type mismatch, argument
Error: The parameter is incorrect
Чтобы исправить ошибку несоответствия типов, я сделал массив int32
x = int32(x);
Вторая ошибка была более трудной для отладки. Оказывается, я должен был сделать еще две вещи. Сначала мне нужно было включить один из dim safe массивов, например, так:
feature('COM_SafeArraySingleDim', 1)
Затем я понял, что COM-объекты должны передаваться "Векторы столбцов", а не "Векторы строк".
Как только я изменил x из [ 2,5,7] до [2; 5; 7], тогда у меня все заработало без ошибок. (обратите внимание, что вы могли также преобразовать вектор строки в вектор столбца, выполнив x = x. ')
Просто опубликуйте это для любого, кто столкнется с этой проблемой в будущем. COM - это очень старая технология, и найти информацию о ней очень сложно.
Ссылки:
https://www.mathworks.com/matlabcentral/answers/92424-how-can-i-pass-arguments-to-an-activex-server-from-matlab-7-0-r14-as-one-dimensional-arrays
https://www.mathworks.com/help/matlab/matlab_external/handling-com-data-in-matlab-software.html#brc5jeu -1
https://www.mathworks.com/matlabcentral/answers/94888-how-can-i-pass-arguments-by-reference-to-an-activex-server-from-matlab-7-0-r14