簡體   English   中英

在Matlab中找到所有點到水平線的總距離

[英]Find sum distance to horizontal line for all points in Matlab

我有一個大約 30,000 pts 的散點圖,所有這些都位於我在圖中直觀定義的水平線上方。 我現在的目標是將所有這些點到這條水平線的垂直距離相加。

數據是從.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

我知道使用&&運算符的先決條件是我相信有兩個logical語句,但我目前不確定如何以這種方式重寫此循環。 我也不明白為什么vert_deviation返回NaN ,但我認為這可能與我描述的第一個錯誤有關......

我真的很感激這里的一些指導 - 在此先感謝您!

編輯:“水平線”是一個輕微的過度簡化 - 實際上我需要找到由 6 個不同線段組成的距離的下限

我應該指定我需要計算所有散點圖點的距離的下限因不同的 x 值而異(水平線片段是為了簡化,但可能會產生誤導......對此表示歉意)

我首先修改了我已經讀入工作區的數據,將所有NaN值替換為0 接下來,我編寫了一個while循環,它定義了要循環的索引數,並定義了一個&&條件來過濾掉所有零。 然后我編寫了一個嵌套的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循環對下限的每個部分重復六次。

我相信有更優雅的方法可以做到這一點,所以如果有改進的余地,我願意接受任何反饋!

您的循環不排除 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 中的代碼過度簡化了問題。 查看發布的附加代碼,我想仍然可以刪除循環,但我不確定這是否會顯着提高速度。 只需使用一個循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM