How to avoid creating 1x1 struct?

28 次查看(过去 30 天)
Sven Larsen
Sven Larsen 2024-3-10
编辑: Stephen23 2024-3-11
I have created within for loop a 1x8 struct origStruct which is visual and very easy to read.
now I also have to do separately another 1x35 struct with interpolated data. Hower, all I can create is this annying 1x1 stuct with 2 fields. what i'm doing wrong?
code is:
newStruct.b = linspace(origStruct(1).b,origStruct(end).b ,35);
newStuct.e = spline(origTimeSteps,[origStruct.e],35);
and I get this which serves no purpose whatsoever since it doesent look like table:
tried code versions like:
newStruct{:}.b = linspace(origStruct(1).b,origStruct(end).b ,35);
newStruct{1:35}.b = linspace(origStruct(1).b,origStruct(end).b ,35);
newStruct.b = deal(linspace(origStruct(1).b,origStruct(end).b ,35));
but none does give proper outcome

回答(1 个)

Stephen23
Stephen23 2024-3-10
编辑:Stephen23 2024-3-10
b = linspace(..);
e = spline(..);
newStruct = struct('b',num2cell(b),'e',num2cell(e));
"I get this which serves no purpose whatsoever since it doesent look like table"
Storing lots of scalar numerics in a non-scalar structure will generally make processing your data harder and less efficient than storing numeric arrays in a scalar structure. A table might be a better choice for your requirements.
  2 个评论
Sven Larsen
Sven Larsen 2024-3-10
编辑:Sven Larsen 2024-3-10
why above works but this one does not?
newStruct = struct;
newStruct.b = num2cell(linspace(passbyDataTemp(1).ourTrainTime,passbyDataTemp(end).ourTrainTime ,interpTimeStepsN));
newStruct.e = num2cell(spline(origTimeSteps,[passbyDataTemp.speed],interpTimeSteps));
this is my main gripe with matlab structs; sometimes matlab decides that your struct will be 1x8 structs, some times it decides they are 1x1 struct where fields are 1x8 ...
How can I tell matlab that given struct will be treaded as 1xX struct, not 1x1 struct?
"Storing lots of scalar numerics in a non-scalar structure will generally make processing your data harder and less efficient than storing numeric arrays in a scalar structure. A table might be a better choice for your requirements."
1x1 structs have their uses but for data research purposes, visually readable 1xX structs are way to go. And tables are such an abomination in Matlab that I avoid them at all cost.
Stephen23
Stephen23 2024-3-10
编辑:Stephen23 2024-3-11
"why above works but this one does not?"
Because of what you are telling MATLAB to do:
newStruct = struct; % you tell MATLAB to create a scalar structure.
newStruct.b = num2cell(..); % you tell MATLAB to create a field and store a cell array in that field.
newStruct.e = num2cell(..); % you tell MATLAB to create a field and store a cell array in that field.
There is absolutely nothing in your code (e.g. indexing, concatenation, REPMAT, etc) that would tell MATLAB to create anything other than a non-scalar structure. You explicitly told MATLAB to create a scalar structure, so that is exactly what MATLAB does.
"sometimes matlab decides that your struct will be 1x8 structs, some times it decides they are 1x1 struct where fields are 1x8 ..."
MATLAB does not decide things randomly.
"what i'm doing wrong?"
One array (e.g. that returned by LINSPACE or NUM2CELL etc.) is one array. One array is not automatically allocated to lots of separate arrays (just because you want this). MATLAB has some very specific syntaxes for allocating one array into lots of separate arrays, which you will need to use:
Here is one approach using two comma-separated lists:
new = repmat(struct,1,8);
tmp = num2cell(linspace(..));
[new.b] = tmp{:};
In general your code will be simpler and more efficient when you keep numeric data together.

请先登录,再进行评论。

类别

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