Splitting an array into smaller unequal-sized arrays dependend on array-column values

5 views (last 30 days)
Hello all, I'm quite new to MatLab and this problem really drives me insane:
I have a huge array of 2 column and about 31,000 rows. One of the two columns depicts a spatial coordinate on a grid the other one a dependent parameter. What I want to do is the following:
I. I need to split the array into smaller parts defined by the spatial column; let's say the spatial coordinate are ranging from 0 to 500 - I now want arrays that give me the two column values for spatial coordinate 0-10, then 10-20 and so on. This would result in 50 arrays of unequal size that cover a spatial range from 0 to 500.
II. Secondly, I would need to calculate the average values of the resulting columns of every single array so that I obtain per array one 2-dimensional point.
III. Thirdly, I could plot these points and I would be super happy.
Sadly, I'm super confused since I miserably fail at step I. - Maybe there is even an easier way than to split the giant array in so many small arrays - who knows..
I would be really really happy for any suggestion.
Thank you,
Arne

Accepted Answer

Guillaume
Guillaume on 7 Nov 2014
Edited: Guillaume on 7 Nov 2014
Using the new histcounts (it works the same with histc)
m=[1 2;2 5;4 7;5 10;6 9;3 3]
[~, ~, indices ] = histcounts(m(:, 2), 0:2:max(m(:, 2)))
mbinned = arrayfun(@(idx) m(indices == idx, :), unique(indices), 'UniformOutput', false)
mcol1 = accumarray(indices, m(:, 1), [], @mean);
mcol2 = accumarray(indices, m(:, 2), [], @mean);
meanbin = [mcol1 mcol2]

More Answers (2)

dpb
dpb on 7 Nov 2014
One option -- see
doc histc
  1 Comment
Andrei Bobrov
Andrei Bobrov on 7 Nov 2014
Edited: Andrei Bobrov on 7 Nov 2014
comment by Arne
Thank you :) - I thought of histc as well; but as I said Im rather new to MatLab - so far I only used histc for separating a vector and counting the frequency of certain ranges.
Now, I need to separate for a certain array column and actually obtain the values of both columns not just the counts.
Do you know of a syntax?
E.G.
I have Matrix
1 2
2 5
4 7
5 10
Let's say I'd like to obtain the rows (with actual values) that have column2-value 0-1; 1-2; ... 9-10.
I haven't managed to get to that result with histc. But maybe I have overseen sth..

Sign in to comment.


Arne
Arne on 7 Nov 2014
your code looks very elegant and makes sense; however, due to the properties of my array I get the following error when trying to type the mcol-lines: Error using accumarray First argument SUBS must contain positive integer subscript. - maybe since my columnelements are negative and double numbers it has some difficulties.
Secondly, in the next line mcol2 (...) - do we have to fill in again m(:, 1) or rather m(:, 2)
sorry for the questions - getting there :)
  5 Comments
Guillaume
Guillaume on 7 Nov 2014
Ah, 0 is not expected in the indices, since it's not a valid index for a matrix element.
This means that some values are outside the range specified by the bins for histcount. Either you have some values below -430, or more likely, the max is not a multiple of 5,
histcounts(m(:, 2), -430:5:max(m(:, 2))+5)
should solve it.
Arne
Arne on 7 Nov 2014
yes, that was a rookie mistake.. but it works now - so happy; saved me at least 3 days of work - thank you, guys!

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!