Why is my for loop outputting empty matrices?

3 views (last 30 days)
This is a snippet of my current code to calculate the number of data points in a single grid. "i = [103.6:(1/75):104]" represents the x axis values of each vertical grid line, "j = [1.25:(1/120):1.5]" represents the y axis values of each horizontal grid line. "coordinates" is a n x 3 numeric matrix that contains the station number, lat coordinates, and lon coordinates. I'm trying to find the row number of all the stations that fall in a single grid. Is there something wrong with my code? It keeps producing empty matrices for "index" and "stns". Safe to say it's not producing anything at all.
Also, in my find function, does (i + 1) represent the next value in the i vector or am I adding a value of 1 to the current value of i? I'm new to Matlab so I apologize if my questions come off as a bit silly. Thanks in advance!
lat = coordinates(:,2); % x coordinates
lon = coordinates(:,3); % y coordinates
% create nested for loop
for i = [103.6:(1/75):104]
for j = [1.25:(1/120):1.5]
% index = row number
index = find(lat > i & lat < i + 1 & lon > j & lon < j + 1);
stns = coordinates(index,1); % stn number
end
end
  1 Comment
Torsten
Torsten on 30 May 2017
Edited: Torsten on 30 May 2017
I'm quite sure you won't find indices where (lat>i & lat<i+1) and (lon>j & lon<j+1) are simultaneously satisfied .
You will first have to apply "meshgrid" to "lat" and "lon" and then start your search.
Best wishes
Torsten.

Sign in to comment.

Accepted Answer

Rik
Rik on 30 May 2017
You are adding 1 to i, because Matlab has no way of knowing that you mean the next value.
In the find command, you should really add some parentheses to make sure that you are actually getting what you mean.
You are overwriting stns each loop. What I would do if I were you is making stns a cell.
%generate dummy data:
n=1000;
coordinates=[randperm(n)', rand(n,1)*0.4+103.6, rand(n,1)*0.25+1.25];
lat = coordinates(:,2); % x coordinates
lon = coordinates(:,3); % y coordinates
% create nested for loop
i_vector=103.6:(1/75):104;
j_vector=1.25:(1/120):1.5;
stns=cell(length(i_vector),length(j_vector));
for i = 1:(length(i_vector)-1)
%you can't access element end+1
for j = 1:(length(j_vector)-1)
% index = logical indexing vector
index = (lat > i_vector(i)) ...
& (lat < i_vector(i+1)) ...
& (lon > j_vector(j)) ...
& (lon < j_vector(j+1)) ;
stns{i,j} = coordinates(index,1); % stn number
end
end
Now you can look in the variable editor to see what stations are in what grid location. If you want to have the row number you can add this line coordinates(:,4)=1:size(coordinates,1); and change the ,1 to ,4 in the line that writes to stns.
PS I think this could be done more elegantly (and faster for bigger datasets), but this is most similar to your code, easy to understand, and not absurdly slow for most lists of stations.
  2 Comments
Rik
Rik on 31 May 2017
You're welcome, although I advise you to also have look at histcounts2, as Jan Simon suggested. Depending on how you want to further process the result that may be more efficient.

Sign in to comment.

More Answers (1)

Jan
Jan on 30 May 2017
This is a job for the efficient histcounts2.

Community Treasure Hunt

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

Start Hunting!