【发布时间】:2020-01-17 03:15:38
【问题描述】:
我的帖子涉及以下问题:
Avoid division by zero between matrices in MATLAB
How to stop MATLAB from rounding extremely small values to 0?
我正在编写一个使用 codegen 导出的 matlab 函数。当 codegen 执行两个数字之间的除法时,都是原始双精度数,codegen 提到结果是 :Inf x :Inf 的类型。这是我的代码片段:
travel_distance = stop_position - start_position;
duration = stop_time - start_time;
velocity = (travel_distance / duration);
travel_distance 或 duration 变量都不为零。在代码生成期间,当我检查 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 和 velocity 都是 1x1 类型,因为我知道这些应该是原始结果。
通过允许速度变量为 :Inf x 1 或 1x1,我能做些什么来确保 matlab 正确执行代码生成? (双精度或整数输出都可以)
【问题讨论】:
-
你试过用
./代替/吗?我猜:Inf x 1指的是一个未知长度的向量,:Inf x :Inf指的是一个未知大小的矩阵。这与除以零无关。 -
那行得通。我想知道为什么?不知道为什么我的矩阵大小未知。它应该始终是 1x1。
-
Codegen 可能无法保证这一点。
-
@CrisLuengo 我想可能是这样。抽象。感谢您的快速回复。请留下它作为答案,这样我就可以结束这个问题了。
标签: matlab