В настоящее время я пишу графический интерфейс для ввода функций перехода физической динамики для последующего моделирования произвольной среды.
Я хочу включить линейную алгебру, поскольку это значительно упрощает пользователю (мне)входные данные и определения функций перехода.
Теперь проблема в том, что может случиться, что некоторый векторный продукт (скаляр) умножается на матрицу. Однако это приводит к несоответствию размеров матрицы в библиотеке Eigen.
Немного предыстории о том, как она должна работать. Я использую std::map<std::string, Eigen::MatrixXd> variables
для хранения всех переменных ввода от пользователя. Затем пользователь может ввести некоторую функцию, она автоматически генерируется и компилируется, а затем используется для имитации заданных переходов.
Например:
Пользователь вводит переменные delta_t = 1
, a = 0.5
, v = 0.0
, x = 0.0
.
Также функции перехода:
a = a
v = v + a * delta_t
x = x + v * delta_t
Теперь некоторый код генерируется автоматически, и симуляция может запускаться с delta_t = 1 sec
для каждого шага симуляции,Это все работает без проблем. Если я теперь использую Векторы вместо скаляров, это становится проблематичным. В данном примере все является матрицей 1x1, поэтому никаких сложностей во время выполнения. Для переменных:
delta_t = 1
a = [0.5, 0.5, 0.5]
v = [0.0, 0.0, 0.0]
x = [0.0, 0.0, 0.0]
и тех же функций перехода я получаю ошибку времени выполнения, так как между dt и a существует несоответствие размеров. Теперь в этой конкретной ситуации я мог бы включить некоторую защиту во время генерации кода, чтобы уловить такие проблемы, однако, если вычисления становятся больше, и, возможно, есть некоторые промежуточные вычисления, которые приводят к скаляру, я не мог бы поймать это раньше без вычисления каждого измерениякаждого матричного / векторного произведения и проверки, если это 1x1. Есть ли способ сделать это вычисление n-by-m * 1-на-1 (лучший случай в собственных) без необходимости вручную проверять размеры для матриц 1-на-1? Если нет, у вас есть идеи, как решить эту проблему? Или я просто упускаю что-то действительно очевидное?