【问题标题】::Inf x 1 divided by :Inf x 1 yields :Inf x :Inf Matlab:Inf x 1 除以 :Inf x 1 得到 :Inf x :Inf Matlab
【发布时间】: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


【解决方案1】:

我不认为这与除以零有关,正如您为避免这种情况所做的尝试所表明的那样。 :Inf x 1 是一个未知长度的向量,:Inf x :Inf 是一个未知大小的矩阵。如果duration 是一个向量,那么travel_distance / duration 正在尝试求解一个线性方程组。

如果您使用./(逐元素除法)而不是/,那么Codegen 或许能够生成正确的代码:

velocity = travel_distance ./ duration;

【讨论】:

    猜你喜欢
    • 2017-04-13
    • 2015-11-02
    • 1970-01-01
    • 2020-01-21
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    • 2012-06-27
    • 2016-10-02
    相关资源
    最近更新 更多