Extract data from a cell array/struct

조회 수: 83 (최근 30일)
Richard Rees
Richard Rees 2019년 7월 30일
댓글: Richard Rees 2019년 7월 31일
Good afternoon,
I have been having this probelm all day and I cannot fix it. I am trying to extract the the 3rd column (WaterCumulativeMass) from each of the cell arrays. The problem I am encountering is that the second cell array only contains the headers and no values (which is correct), so to keep consistancy with the other arrays I blank it. This has the effect of turning the cell array into a Struct which I then convert back into a cell array.
The code which works partially (shown) extracts the data from the third column of cell array but combines it into a single column vector where I would like it as columns like it would normally do in a matrix for anything involving a loop function with counter. If I were to use anything with a counter i.e. ABC(i) = array{i}.data(:,3) it states that the left and right sides are not equal or the dot function is not applicable to this etc.
I have tried extracting the data from the struct format aswell but this again will not work
Can someone help please?
% Partially successful cell array method
CC = mydata_EL;
CC{2} = [];
for i = 3:numel(CC); % Needs to start at 3rd column because of the blanks
ABC = CC{i}.data(:,3)% Does extract 3rd columns. Creates a single vector
%ABC(i) = CC{i}.data(:,3) # Does not work with the counter
end
  댓글 수: 3
Richard Rees
Richard Rees 2019년 7월 31일
편집: Richard Rees 2019년 7월 31일
Apollogies, I didn't realise I saved all the work space variables. Attached is the correct variable (CC.mat)
What I want to do is to extract the third column of the data field from each struct within the cell array and complile it into a matrix, whereby each extraction has its own column.
At the moment I can extract the data but it arranges it into a single vector i.e. 623x1 whereas I need in this instance 191x6
Eva-Maria Weiss
Eva-Maria Weiss 2019년 7월 31일
But since the number of values of both shapes you've written here is not equal, something else might going wrong...

댓글을 달려면 로그인하십시오.

채택된 답변

Guillaume
Guillaume 2019년 7월 31일
What I want to do is to extract the third column of the data field from each struct within the cell array and complile it into a matrix, whereby each extraction has its own column [..] I need in this instance 191x6.
That's a lot clearer and easily done. Except for the 191 which I have no idea where it comes from since each data matrix is 636x3. The following creates a 636x6 matrix:
%concatenate the structure in each cell into a structure array:
data_struct = [mydata_EL{3:end}];
%concatenate the data field of each element of the array into a 3D matrix
data_mat = cat(3, data_struct.data);
%extract column 3 and reshape the Mx1xN array into a MxN array
data_col3 = squeeze(data_mat(:, 3, :));
The first two lines of code use what is known as expansion of cell arrays and structure arrays into comma-separated lists. For example,
[mydata_EL{2:end}]
is automatically expanded by matlab into
[my_data_EL{3}, my_data_EL{4}, .., my_data_EL{end}]
and
cat(3, data_struct.data)
automatically expanded into
cat(3, data_struct(1).data, data_struct(2).data, .., data_struct(end).data)
  댓글 수: 1
Richard Rees
Richard Rees 2019년 7월 31일
That's very elegent. Thank you for your help.

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Structures에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by