Why is my for loop outputting empty matrices?

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

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

Code works great! Thank you, Rik!
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)

Categories

Find more on Just for fun in Help Center and File Exchange

Asked:

on 30 May 2017

Commented:

Rik
on 31 May 2017

Community Treasure Hunt

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

Start Hunting!