Extract data from all values of a containers.Map collection

18 views (last 30 days)
Alon Rozen
Alon Rozen on 16 Mar 2020
Commented: Alon Rozen on 16 Mar 2020
Hi all,
Suppose I have a containers.Map key/value collection with n entries (hundreds and more). Suppose all entries have a filed ‘My_Filed’ which is an array of 1x3 doubles.
I want to create a matrix of nx3 from all these values. Of course, I can achieve this by getting all values and use a ‘for loop’ to build the matrix (with pre-allocation for speed).
My question is: is there a faster way to create this matrix?

Accepted Answer

Guillaume on 16 Mar 2020
Edited: Guillaume on 16 Mar 2020
This doesn't involve any loop, either explicit or via any of the ***fun functions. However all the structures in the map must have identical fields and all the structures must be scalar:
allvalues = yourmap.values; %extract values, stored as a cell arrays
allvalues = vertcat(allvalues{:}); %convert cell array of N structures into a Nx1 structure array, will fail if at least one structure has different fields
fieldvalues = vertcat(allvalues.My_Filed); %extract field into a Nxm matrix. Will fail if at least one field is not the same size as the others

More Answers (1)

Mohammad Sami
Mohammad Sami on 16 Mar 2020
I assume that each of value in the container is a struct with identical fields.
You can just get all the values like this
% M = containers.Map
valueSet = values(M); % this will return a cell array of structs.
My_Filed = cellfun(@(x)x.My_Filed,valueSet,'UniformOutput',false);
My_Filed = vertcat(My_Filed{:});
Alon Rozen
Alon Rozen on 16 Mar 2020
It is similar the answer I accepted - but I prefere the one without the cellfunc. These functions tends to be slower then a loop in many cases.

Sign in to comment.




Community Treasure Hunt

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

Start Hunting!

Translated by