: Inf x 1, деленное на: Inf x 1, дает: Inf x: Inf Matlab - PullRequest
1 голос
/ 16 января 2020

Мой пост связан со следующими вопросами:

Избегайте деления на ноль между матрицами в MATLAB

Как запретить MATLAB округлять чрезвычайно малые значения 0?

Я пишу функцию Matlab, которую я экспортирую с codegen . Когда codegen выполняет деление между двумя числами, оба примитива удваиваются, codegen упоминает, что результатом является тип: Inf x: Inf. Вот мой фрагмент кода:

travel_distance = stop_position - start_position;
duration = stop_time - start_time;
velocity = (travel_distance / duration);

Ни переменная travel_distance, ни длительность не равны нулю. Во время codegen, когда я проверяю переменные travel_distance и duration, они оба: Inf x 1. Однако скорость отображается как: Inf x: Inf. Это показано также для блока кода (travel_distance / duration). Я подозреваю, что я сталкиваюсь со сценарием, упомянутым автором во второй ссылке, где упоминается эта цитата:

MATLAB не изменит значение на 0. Однако возможно, что результат, если результат использование значения в операции неотличимо от использования 0

Я пробовал несколько вещей, чтобы попытаться решить мою проблему, и все еще получаю то же самое. Например:

% increment by a small number
velocity = ((travel_distance + 0.0001) / (duration + 0.0001));

% check if nan, and set to 0
velocity(isnan(velocity)) = 0;

% check if nan or inf and set to 0
if (isnan(velocity) || isinf(velocity))
    velocity = 0;
end

Я бы на самом деле ожидал, что travel_distance, duration и speed относятся к типу 1x1, поскольку я знаю, что это должны быть примитивные результаты.

Что я могу сделать, чтобы Matlab правильно выполнял кодоген, позволяя переменной скорости быть либо: Inf x 1, либо 1x1? (Двойной или внутренний выход в порядке)

1 Ответ

1 голос
/ 16 января 2020

Не думаю, что это связано с делением на ноль, о чем свидетельствуют ваши попытки избежать этого. :Inf x 1 относится к вектору неизвестной длины, а :Inf x :Inf - к матрице неизвестного размера. Если duration является вектором, то travel_distance / duration пытается решить систему линейных уравнений.

Если вы используете ./ (поэлементное деление) вместо /, тогда Codegen может быть возможность генерировать правильный код:

velocity = travel_distance ./ duration;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...