Передача списков функций 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.

Другие вопросы по тегам