Передача списков функций MathLink с различными структурами
Я разрабатывал приложение 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]]
на с-стороне вещей.
Оказывается, для функции двух списков, как g
, один звонок MLGetReal64Array
вернет оба параметра сразу, т.е. g
получает List[ zi, fi ]
, Поскольку я планирую предварительно обработать каждый список на предмет однородности структуры и типа элемента, обеспечение того, чтобы оба элемента имели одинаковый тип элемента, не будет проблемой. Но я бы хотел за fi
быть списком матриц, и MLGetReal64Array
вызывает MLEGSQ: MLGet() called out of sequence
ошибка.
Итак, мои вопросы: могу ли я использовать MLGetReal64Array
получить оба списка? как бы я пошел по этому поводу? И если я не могу использовать MLGetReal64Array
какие у меня альтернативы?
Я думаю, что если MLGetReal64Array
правильно о структуре, я могу выскочить внешний List
от ссылки с помощью MLGetFunction
который тогда позволил бы мне использовать MLGetReal64Array
для каждого параметра. Пока еще не пробовал. Но пока я буду признателен за любые предложения.
1 ответ
Я бы создал отдельные функции для разных случаев, которые у вас есть. Гораздо проще справиться с этой логикой на стороне Mathematica, чем выяснить, что вы получаете по ссылке в C.