【问题标题】:Find sum distance to horizontal line for all points in Matlab在Matlab中查找所有点到水平线的总距离
【发布时间】:2020-01-08 00:47:42
【问题描述】:

我有一个大约 30,000 点的散点图,所有这些都位于我在绘图中直观定义的水平线上方。我现在的目标是将所有这些点到这条水平线的垂直距离相加。

数据是从.csv文件中读入的,已经保存到工作区,但我还需要检查一个值是否为NaN,忽略这些。

这就是我现在所处的位置:

vert_deviation = 0;
idx = 1;
while idx <= numel(my_data(:,5)) && isnan(idx) == 0
    vert_deviation = vert_deviation + ((my_data(idx,5) - horiz_line_y_val));
    idx = idx + 1;
end

我知道使用&amp;&amp; 运算符的先决条件是我相信有两个logical 语句,但目前我不确定如何以这种方式重写这个循环。我也不明白为什么vert_deviation 现在返回NaN,但我认为这可能与我描述的第一个错误有关......

非常感谢您提供一些指导 - 提前谢谢您!

编辑:“水平线”有点过于简单化了——实际上,我需要找到由 6 个不同线段组成的距离的下限

【问题讨论】:

  • 单笔金额如何:vert_deviation = sum(((my_data(:,5) - horiz_line_y_val)), 'omitnan');
  • 感谢您的回复-您发布的代码运行良好,但我应该指定水平线是一种简化-实际上,情节不同部分的下限会发生变化,我需要检查散点图上给定 pt 的 x 值范围。
  • edit 这个问题包含一个真正的minimal reproducible example,而不是过于简单化。
  • edit问题包含您在下面写的信息。下面的空间是为您发布的问题的答案保留的,而不是为 cmets 的答案。
  • 这是我发布的问题的解决方案,因此我将其作为答案上传。在 OP 中也添加了说明。

标签: matlab conditional-statements


【解决方案1】:

我应该指定我需要计算所有散点图点距离的下限因不同的 x 值而异(水平线 sn-p 是为了简化,但可能具有误导性......抱歉为此)

我首先通过将所有NaN值替换为0来修改我已经读入工作区的数据。接下来,我编写了一个 while 循环,它定义了要循环的 if 索引数,并定义了一个 &amp;&amp; 条件来过滤掉任何零。然后,我编写了一个嵌套的if 循环,它检查给定索引的 x 值范围,然后获取绘图该部分的线性线下限的 y 值与给定点之间的增量。我对所有点都重复了这一点。

while idx <= numel(my_data(:,3)) && not(my_data(idx,3) == 0)
    ...
    if my_data(idx,3) < upper_x_lim && my_data(idx,5) > lower_x_lim
        vert_deviation = vert_deviation + (my_data(idx,4) - (m6 * (my_data(idx,5)) + b6))
    end
    ...

m6b6 在这种情况下是为绘图的一部分计算的斜率和 y 截距。 if 循环对下限的每个部分重复六次。

我确信有更优雅的方法可以做到这一点,所以如果有改进的余地,我愿意接受任何反馈!

【讨论】:

  • 这是对您自己问题的回答还是澄清?如果需要澄清,请删除此答案并更新您的问题。
  • 这不是澄清。这是我的问题中描述的问题的解决方案。
【解决方案2】:

您的循环不排除 NaN 值,因为 isnan(idx) == 0 检查索引是否为 NaN,而不是检查数据点是否为 NaN。相反,请检查 isnan(my_data(idx,5))


此外,您可以使用for 而不是while 来简化您的代码:

vert_deviation = 0;
for idx=1:size(my_data,1)
   if !isnan(my_data(idx,5))
      vert_deviation = vert_deviation + ((my_data(idx,5) - horiz_line_y_val));
   end
end

正如@Adriaan 建议的那样,您可以完全删除循环,但似乎 OP 中的代码过于简化了问题。查看发布的附加代码,我想仍然可以删除循环,但我不确定这是否会显着提高速度。只需使用循环即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 2021-07-10
    相关资源
    最近更新 更多