Create table from structure - alignment
1 visualizzazione (ultimi 30 giorni)
Mostra commenti meno recenti
I have a structure with scalar fields, say mom, and I would like to display the values of the structure on the screen in aligned columns, possibly with some header. Here is a minimum working example:
mom.a = 1;
mom.b = 2;
mom.veryLongName = 3;
header = {'Moment'; 'Value'};
fnames = fieldnames(mom);
pvec = zeros(numel(fnames),1);
for i = 1:numel(fnames)
pvec(i) = mom.(fnames{i});
end
fprintf('%s \t \t %s \n',header{1},header{2});
for i = 1:numel(fnames)
fprintf('%s \t \t %8.3f \n',fnames{i},pvec(i));
end
This code works OK but the problem is that columns are not aligned, especially if a field has a very long name. This is the output:
Moment Value
a 1.000
b 2.000
veryLongName 3.000
Any suggestion is appreciated!
0 Commenti
Risposta accettata
Stephen23
il 2 Giu 2021
Simpler:
mom.a = 1;
mom.b = 2;
mom.veryLongName = 3;
hdr = {'Moment'; 'Value'};
tmp = [fieldnames(mom),struct2cell(mom)].';
fprintf(' %-20s %-s\n', hdr{:});
fprintf(' %-20s %-8.3f\n', tmp{:});
0 Commenti
Più risposte (1)
per isakson
il 2 Giu 2021
Modificato: per isakson
il 2 Giu 2021
I've modified the format specifier.
%%
mom.a = 1;
mom.b = 2;
mom.veryLongName = 3;
header = {'Moment'; 'Value'};
fnames = fieldnames(mom);
pvec = zeros(numel(fnames),1);
for i = 1:numel(fnames)
pvec(i) = mom.(fnames{i});
end
%%
name_len = max( [ strlength(header(1)); cellfun( @strlength, fnames ) ] ) + 2;
%%
fprintf( '%-*s%8s\n', name_len, header{1}, header{2} );
for i = 1:numel(fnames)
fprintf( '%-*s%8.3f\n', name_len, fnames{i}, pvec(i) );
end
Two thirds down the page fprintf, Write data to text file you find the description of this use of the format specifier. Search for the subsection "Field Width"
0 Commenti
Vedere anche
Categorie
Scopri di più su Live Scripts and Functions in Help Center e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!