Replace the empty output of find() by the closest element

3 ビュー (過去 30 日間)
Asatur Khurshudyan
Asatur Khurshudyan 2020 年 1 月 24 日
コメント済み: Asatur Khurshudyan 2020 年 1 月 26 日
Hello everyone,
I have two arrays
a1 = [t1, t2, t3, t4, t5];
a2 = [t1, t1 + d, t1 + 2 * d, t1 + 3 * d];
I use find()
for i = 1:length(a1)
indices(i) = find( a1 == a2(i) );
end
If some elements of a2 are not contained in a1, some of the find() outputs are empty. How to replace these empty elemenets by the indices of the next closest number?
I have tried
for i = 1:length(a1)
indices(i) = find( a1 == a2(i) );
if isempty(indices(i))
indices(i) = indices(i + 1);
end
end
but apparently it does not work.
Your help is highly acknowledged.

採用された回答

John D'Errico
John D'Errico 2020 年 1 月 24 日
編集済み: John D'Errico 2020 年 1 月 24 日
You are trying to use the wrong tool (i.e., find) to solve this. Well, you could use find, I suppose, with some significant effort. But instead, just use a tool designed to solve that problem.
You apparently want to locate the index of the closest element in a2 to each element in a1. If there is an exact match, that is a great thing, but otherwise, you want the closest match. I'm not sure how you would resolve the case where there are two elements of a2 that are equidistant. I would think that logically, you would choose the first such match from equals.
Regardless, This is a problem solved by knnsearch.
a1 = [2, 3, 4, 5];
a2 = [1, 3, 5, 7, 9, 11];
[idx,D] = knnsearch(a2',a1')
idx =
1
2
2
3
D =
1
0
1
0
As you can see, knnsearch did exactly that.
  6 件のコメント
John D'Errico
John D'Errico 2020 年 1 月 25 日
Oh, by the way, interp1 would also have worked for this problem, though there is no reason why someone would have thought to use it.
That is, to find the index of the closest point in a2, for every point in a1?
ind = interp1(a2,1:numel(a2),a1,'nearest');
That should work. As long as the elements of a2 are sorted in an increasing order, and there are no replicates in a2, no problem.
Should you use interp1 for that? Well, it is a bit of a hack, using a tool to solve a problem it is not designed to solve, but it just happens to do what you want anyway.
Better is to just use knnsearch, a tool designed for the purpose.
Asatur Khurshudyan
Asatur Khurshudyan 2020 年 1 月 26 日
Thank you for your comment. I will test it, because knnsearch works very slowly.

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

その他の回答 (0 件)

カテゴリ

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

Community Treasure Hunt

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

Start Hunting!

Translated by