Plot only adjacent points that are close to each other

12 ビュー (過去 30 日間)
Paul Hoffrichter
Paul Hoffrichter 2020 年 6 月 6 日
コメント済み: Tommy 2020 年 6 月 10 日
I got a good answer to my question:
Here is my MATLAB version:
MATLAB Version 9.8 (R2020a)
Communications Toolbox Version 7.3 (R2020a)
DSP System Toolbox Version 9.10 (R2020a)
Instrument Control Toolbox Version 4.2 (R2020a)
LTE Toolbox Version 3.3 (R2020a)
MATLAB Compiler Version 8.0 (R2020a)
Parallel Computing Toolbox Version 7.2 (R2020a)
RF Toolbox Version 3.8 (R2020a)
Signal Processing Toolbox Version 8.4 (R2020a)
Symbolic Math Toolbox Version 8.5 (R2020a)
But I neglected to say that I use dY_idx and Y_adj_close in a subsequent function call where both arguments must have the same dimensions.
Here is my code that keeps the dimensions the same. Is there any way to improve this code to make it run faster (for large vectors)?
Y = [ 1.1 1.12 9.2 8.3 8.295 8.292 4.1 4.12 4.19];
plot(Y), hold on;
% Original 2 lines of code that loses the right-most point is:
% dY_idx = find(abs(diff(Y)) < 0.022);
% Y_adj_close = Y(dY_idx)
% Here are my 5 lines of code that saves the right-most point to keep the right-most point of each grouping.
% Can these 5 lines be reduced?
logidx = abs(diff(Y)) < 0.022;
xLog = [logidx 0] | [0 logidx];
Y_adj_close = Y( xLog );
dY_idx = 1:length(Y);
dY_idx = dY_idx( xLog );
plot(dY_idx, Y_adj_close, 'r.'), hold off
  6 件のコメント
Walter Roberson
Walter Roberson 2020 年 6 月 8 日
If you are not reusing dY_idx then do not do the find()
Y_adj_close = Y(abs(diff(Y)) < 0.022);
Paul Hoffrichter
Paul Hoffrichter 2020 年 6 月 8 日
From the OP: "I use dY_idx and Y_adj_close in a subsequent function call where both arguments must have the same dimensions."

サインインしてコメントする。

採用された回答

Tommy
Tommy 2020 年 6 月 10 日
logidx = abs(diff(Y)) < 0.022;
dY_idx = find([logidx 0] | [0 logidx]);
Y_adj_close = Y( dY_idx );
Seems to me that every part of these three lines is required, but maybe it can be made even faster.
Of course number of lines alone isn't the only thing to consider. I'd imagine this would be slower:
dY_idx = find([abs(diff(Y)) < 0.022 0] | [0 abs(diff(Y)) < 0.022]);
Y_adj_close = Y( dY_idx );
  2 件のコメント
Paul Hoffrichter
Paul Hoffrichter 2020 年 6 月 10 日
編集済み: Paul Hoffrichter 2020 年 6 月 10 日
Thank you Tommy. You make it look so easy. :)
Functionally both the 3- and 2- line versions work fine. I can understand that the two-liner might be slower; but maybe MATLAB has some optimization that will surprise us. I'll check the timing and report back the results when I integrate the changes into the program. Thanks again!
Tommy
Tommy 2020 年 6 月 10 日
Happy to help!

サインインしてコメントする。

その他の回答 (1 件)

KSSV
KSSV 2020 年 6 月 8 日
Have a look on knnsearch. This function gives you the nearest points/ points specififed by a certain distance for a given set of points.
  6 件のコメント
Walter Roberson
Walter Roberson 2020 年 6 月 9 日
The file exchange has https://www.mathworks.com/matlabcentral/fileexchange/4586-k-d-tree and several other KDTree implementations.
However, if you are working in 1D then it might not be worth it, but interp1() 'nearest' might possibly be faster (I think it calls into mex code.)
Paul Hoffrichter
Paul Hoffrichter 2020 年 6 月 9 日
Just to be clear, I am only interested in whether two adjacent points are within a tolerance. For example, if I have 3 adjacent data points, y1, y2, y3 with following data:
y2 is close enough to y1
y3 is not close enough to y2
y3 is close enough to y1
then outcome should be to select {y1, y2} and corresponding indices. Even though y3 is close enough to y1, it is not adjacent so it is disqualified. My recollection of kd tree alg is that all three points would be accepted, but I could be wrong. And yes, I suspect that for this 1D case, the kd tree or other general algorithms would be overkill. Based on the nature of the data, I do not want y3 to be included.
Here is the big question: Can the OP code be reduced from 5 lines lines of code to 4 or less? The test for success is whether the resultant plot is identical to the OP plot. Often, less lines of code without using for-loops are better optimized by MATLAB, but I could be wrong on that account since I am fairly new to MATLAB.

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeLogical についてさらに検索

製品


リリース

R2019b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by