organising large sets of data into a irregular matrix

judith schweimer (view profile)

on 7 Mar 2019
Latest activity Answered by judith schweimer

on 13 Mar 2019

Jos (10584) (view profile)

Hello,
I have a large data sets with of 40000+ samples, which are organised in 2 columns. The first colum tells me a cluster-number (column 1) by which I would like to sort, and the second a value is a time which I would like to allocated to the individual clusters.
the data looks something like:
A=[32 7.83425
32 8.0074
5 8.01005
5 8.0119
5 8.10775
19 8.1082
7 8.1085
4 8.1089]
I would like to organise this set into a matrix or table. One caveat is that the clusters are different sizes.
I have managed to get the individual cluster number out of my matrix, using the unique function.
I thought this would be similar to this thread:
However I am struggling to assign the values to the clusters because of the irregular number of values per cluster.
Can someone help me with this?

R2018a

Jos (10584) (view profile)

on 7 Mar 2019

You can use cell arrays for this.
A=[ 32 7.83425
32 8.0074
5 8.01005
5 8.0119
5 8.10775
19 8.1082
7 8.1085
4 8.1089 ]
[unA, ~, j] = unique(A(:,1)) ;
C = accumarray(j, A(:,2), [numel(unA),1], @(x) {x})
% The cell C{k} contains all values that belong to unA(k)
However, for some purposes you can also use a matlab table, for which dedicated functions, like splitapply, exist to operate on groups. This may worthy of some exploration on your site ...

Show 1 older comment
Jos (10584)

Jos (10584) (view profile)

on 8 Mar 2019
I think you're better off writing to a text file. An option:
C = {[1 2 3], 1, [1 2 3 4]} % some test data
myfile = 'myfile.txt' ;
dlmwrite(myfile ,reshape(C{1},1,[]))
for k=2:size(C,1),
dlmwrite(myfile , reshape(C{k},1,[]), '-append') ;
end
judith schweimer

judith schweimer (view profile)

on 8 Mar 2019
Almost perfect, I just need to switch columns and rows of the myfile, I will try this later, else I have trouble importing the data into Excel due to too long rows.
Thank you very much!
Jos (10584)

Jos (10584) (view profile)

on 8 Mar 2019
You're welcome :-)
Switching to column orientation inside the text file might not be trivial though. As you need to re-arrange the values between the cells of C.
You might also be interested in xlswrite, btw.

judith schweimer (view profile)

on 13 Mar 2019

The xlswrite function did the trick! It took me a while to get it to work, but now I am happy! So simple!
myfile = '*.xlsx' ;
for k=1:size(C,1)
xlswrite(myfile ,reshape(C{k},[],1),k);
end
Thanks again, Jos!