Передача списков функций MathLink с различными структурами - PullRequest
0 голосов
/ 13 июля 2011

Я разрабатывал приложение MathLink с функцией, которая принимает два списка, например,

:Pattern: g[zi_List, fi_List]

, которые я намеревался добавить в функцию вручную.Оба списка могут быть реальными или сложными, а результат может быть сложным, если какой-либо из параметров является сложным.Кроме того, fi может быть списком квадратных матриц, но zi должен оставаться одномерным списком.

В MathLink C API наиболее простой кажущейся функцией для использования является MLGetReal64Array, которая может обрабатывать как реальные, так и сложные типы данных, как показывает Complexкак самый внутренний Head массива.И, как только сложность определена, массив может быть приведен к std::complex<double> или сложному типу C99, если это необходимо.Теперь MLGetReal64Array не обрабатывает непрямоугольный Lists, поэтому каждый элемент List должен иметь размерность других и быть одного типа: вещественный из сложного.Как ни странно, с функцией, которая принимает один параметр List, MLGetReal64Array возвращает структуру данных, которая имеет один элемент List в качестве самого внешнего элемента, т.е. ввод h[ {1, 3, 5} ] возвращает List[List[1,3,5]] на стороне cвещей.

Оказывается, что для функции с двумя списками, такой как g, один вызов MLGetReal64Array вернет оба параметра одновременно, т.е. g получает List[ zi, fi ].Так как я планирую предварительно обработать каждый список для однородности структуры и типа элемента, обеспечение того, чтобы оба элемента имели одинаковый тип элемента, не будет проблемой.Но я бы хотел, чтобы fi был списком матриц, а MLGetReal64Array вызывает ошибку MLEGSQ: MLGet() called out of sequence.

Итак, мои вопросы: могу ли я использовать MLGetReal64Array, чтобы получить оба списка?как бы я пошел об этом?И, если я не могу использовать MLGetReal64Array, каковы мои альтернативы?

Я думаю, что если MLGetReal64Array верен относительно структуры, я могу вытолкнуть внешний List из ссылки с помощьюиспользуя MLGetFunction, что позволило бы мне использовать MLGetReal64Array для каждого параметра.Пока еще не пробовал.Но пока я буду признателен за любые предложения.

1 Ответ

1 голос
/ 13 июля 2011

Я бы создал отдельные функции для разных ваших дел. Гораздо проще справиться с этой логикой на стороне Mathematica, чем выяснить, что вы получаете по ссылке в C.

...