How to assign filtered data of tables to new tables and then store them into a data structure?
Show older comments
Hello to everyone I proceed to illustrate step by step my program and my issue The first program block import data from 4 .csv files and then store them within a data strcuture after performing some filtering conditions % STRUCTURE CREATION % Initialization of a struct array with "idx_L_point" and "data" fields no_L_points =2 Sol = repmat(struct('L_point','','all',[],'tang',[]),1,no_L_points);
% Import of results for i= 1:no_L_points % from 1 to number of L-points Sol(i).L_point = i;
Sol(i).all.general = readtable(['Solutions_General_L',num2str(i),'.csv'],'VariableNamingRule','preserve');
Sol(i).all.orbital = readtable(['Solutions_Orbital_L',num2str(i),'.csv'],'VariableNamingRule','preserve');
% Filter tangency cases and store in another filed of structure
Sol(i).tang.general = Sol(i).all.general(Sol(i).all.general.nInters==1,:);
Sol(i).tang.orbital = Sol(i).all.orbital(Sol(i).all.orbital.nInters==1,:);
end
In the second block I tried to manipulate these data for a further filtering
%%FILTERING THE MINIMUM VALUES
% Filter the tables by keeping only the ones that contains the minimum
% values.
% Candidate asteroids
Ast_candidates_L1 = unique(Sol(1).all.general.iAst)
Ast_candidates_L2 = unique(Sol(2).all.general.iAst)
for idx_cand_L1 = 1:numel(Ast_candidates_L1) cand_cond_L1 = Sol(1).all.general( Sol(1).all.general.iAst == Ast_candidates_L1(idx_cand_L1),: );
tab_L1_DV_min(idx_cand_L1,:) = cand_cond_L1(cand_cond_L1.("DV_inters(km/s)")== min(cand_cond_L1.("DV_inters(km/s)")),:);
tab_L1_TOF_min(idx_cand_L1,:) = cand_cond_L1(cand_cond_L1.("TOF_SC_Ly_inters(d)")== min(cand_cond_L1.("TOF_SC_Ly_inters(d)")),:);
tab_L1_dist_min(idx_cand_L1,:) = cand_cond_L1(cand_cond_L1.("dist_ast_SC_inters(km)")== min(cand_cond_L1.("dist_ast_SC_inters(km)")),:);
end
for idx_cand_L2 = 1:numel(Ast_candidates_L2) cand_cond_L2 = Sol(2).all.general( Sol(2).all.general.iAst == Ast_candidates_L2(idx_cand_L2),: ); idx_cand_L2 tab_L2_DV_min (idx_cand_L2,:) = cand_cond_L2(cand_cond_L2.("DV_inters(km/s)") == min(cand_cond_L2.("DV_inters(km/s)")) ,:); tab_L2_TOF_min(idx_cand_L2,:) = cand_cond_L2(cand_cond_L2.("TOF_SC_Ly_inters(d)")== min(cand_cond_L2.("TOF_SC_Ly_inters(d)")),:); tab_L2_dist_min(idx_cand_L2,:) = cand_cond_L2(cand_cond_L2.("dist_ast_SC_inters(km)")== min(cand_cond_L2.("dist_ast_SC_inters(km)")),:); end
I can't understand why there is the warning: "Error using () To assign to or create a variable in a table, the number of rows must match the height of the table." regarding the variable "tab_L2_DV_min". Infact i perform the same operations for all that variables but something went wrong with such a variable. 1st question) Can you clarify the reason of this warning and how to fix it ? (maybe show me a better way of coding ) In addition to this first problem, I was trying to create a new structure where to store the six filtered table I computed in the "for" cycles but I had problems with dynamical assignment of variables. The starting idea was to store the filtered tables in the field of structure represented by symbol "[]" in the attached image.

% DATA STRUCTURE FOR MINIMUM VALUES (work in progress)
Results_best = repmat(struct('L_point','','data_DV_min',[],'data_TOF_min',[],'data_dist__min',[]),1,no_L_points);
for i= 1:no_L_points % from 1 to number of L-points
Results_best(i).L_point = i;
Results_best(i).data_DV_min = ...
Results_best(i).data_data_TOF_min = ...
Results_best(i).data_dist__min = ...
end
2nd question) Can you show me a smarter way to code the filtering the minimum values and then to store them in the data structure for minimum values?
1 Comment
Walter Roberson
on 27 Sep 2022
Are there multiple matches for the minimum value, or is it certain that the minima are unique ?
Accepted Answer
More Answers (0)
Categories
Find more on Signal Processing Toolbox in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!