Cannot vertically concatenate tables in for loop
3 次查看(过去 30 天)
显示 更早的评论
Hello experts,
I have an elementary, yet unsolvable issue for me. I checked other questions, I checked the material on the official site but I cannot solve my problem.
I have a 1x1 structure named "tbl" with 17 fields. Each field is a Nx5 table.
I would like to take each table and append that table to the previous one to obtain an Nx5 table, where N is the total number of rows from all the tables.
To append one to the other I know I can do this:
total = [tbl.ID2; tbl.ID4];
But I'd rather do it in a for loop, since I'll add further IDs and it's going to be quite time consuming.
resulting_tbl = table;
for id = tbl
resulting_tbl = [id;];
end
this code above is just creating the same initial structure instead of a new resulting table.
I know I'm missing some basic notions, but I cannot overtake this problem.
Thank you all for your time and help!
Marco
4 个评论
Stephen23
2021-2-8
@Marco Ninghetto: having lots of numbered fields is not very good data design. It would be better to use a non-scalar structure or even just a simple cell array.
采纳的回答
Walter Roberson
2021-2-8
temp = struct2cell(tbl);
resulting_tbl = vertcat(temp{:});
3 个评论
Walter Roberson
2021-2-8
The image you posted showed all tables as having different heights but all of them had 5 variables. Are there non-empty entries that have a different number of variables?
temp = struct2cell(tbl);
wids = cellfun(@(C) size(C,2), temp);
[uwids, ~, uidx] = unique(wids);
counts = accumarray(uidx(:), 1);
[~, maxidx] = max(counts);
report_table = [counts, uwids];
report_table(maxidx,:) = [];
if isempty(report_table)
fprintf('Congrats! All cells have %d variables!\n', uwids(1));
else
fprintf('Opps! Not all cells have the same number of variables! Uncommon ones:\n');
fprintf('%d cells have %d variables\n', report_table.');
end
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Logical 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!