Azzera filtri
Azzera filtri

Find indices of points in meshgrid-like data

18 visualizzazioni (ultimi 30 giorni)
Hi,
I'm looking for an optimal solution to the following problem:
You are given a vector containing coordinates x,y for set of points e.g.:
A = [2 3; 3 4; 1 1];
given that the full-data is structured in a matrix form (meshgrid-like)
[X,Y] = meshgrid(1:5, 1:5);
find indices B, such that:
A = [X(B), Y(B)];
I am able to solve this problem simply by looping over all points in A and finding the index with
for pt = 1:size(A,1);
index(pt) = find(A(pt,1)== X & A(pt,2) == Y);
end
However I'm not satisfied with the performance of this solution as I am running through ~50,000 data points around 300 times, and I'd love to replace the for loop with some vectorized formula.
Any help would be highly appreciated!
Thanks,
Alex

Risposta accettata

Adam
Adam il 26 Set 2018
[~, index] = ismember( A, [X(:) Y(:)], 'rows' );
Not sure if that is any faster than a loop though. ismember is not a very performant function as, if I remember correctly, it contains quite a lot of checks that slow it down.
  1 Commento
Aleksander Marek
Aleksander Marek il 27 Set 2018
It actually works really well, and gives improvement of about 10 times over the for loop.
Thanks a lot!

Accedi per commentare.

Più risposte (1)

Bish Erbas
Bish Erbas il 26 Set 2018
How about this?
A = [2 3; 3 4; 1 1];
[X,Y] = meshgrid(1:5, 1:5);
XIdxCell = arrayfun(@(x) find(X==x),A(:,1),'UniformOutput',false);
YIdxCell = arrayfun(@(x) find(Y==x),A(:,2),'UniformOutput',false);
XIdx = cell2mat(XIdxCell);
YIdx = cell2mat(YIdxCell);
A = [X(XIdx), Y(YIdx)]

Categorie

Scopri di più su Loops and Conditional Statements in Help Center e File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by