Hi, I have several NUM_*.dat files as the two attached. I need to extract rows (excluding some specific values) from that file and convert them into a combined column of values. For instance, from the first file, I need to get a single column which in order includes the values from the file starting in row 2, but excluding the first value of the even rows (row2,4,6…). This process should be done for several NUM_*.dat files, so that the final result is a file which contains as many columns as NUM_*.dat files. Can I get some help to do this in an efficient way? Thanks
MATLAB: How to extract values from rows and convert into a single column for several files
concatenateextract valuestranspose
Related Solutions
I am guessing that unlike your example you actually want the columns to be aligned, e.g. where M is your matrix:
>> fprintf(' %9d %9.6f %15.6f %15.6f\n',M.') 1 0.000000 0.000000 0.000000 2 0.000000 0.000000 4.000000 3 0.000000 0.000000 1.000000 4 0.000000 0.000000 2.000000 5 0.000000 11.000000 4.000000 6 0.000000 12.000000 4.000000 7 0.000000 13.000000 4.000000 8 0.000000 14.000000 4.000000 9 0.000000 15.000000 4.000000 10 0.000000 16.000000 4.000000 11 0.000000 17.000000 4.000000 12 0.000000 18.000000 4.000000 13 0.000000 12.000000 0.000000 14 0.000000 11.000000 0.000000 15 0.000000 10.000000 0.000000
The short answer is: not easily.
Your output example has varying numbers of fractional digits
0.000000 % six decimal places
4.000000 % six decimal places11.00000 % five decimal places
and also varying numbers of significant digits:
0.000000 % six significant figures
4.000000 % seven significant figures
11.00000 % seven significant figures
This excludes using one simple fprintf command (i.e. based on %f or %g) using only your input matrix.
The long answer: one possible approach is to create an array with the required number of significant figures (or decimal places) for each value and use this with the '*' placeholder syntax, e.g. where M is your matrix:
>> X = 7-(M==0);>> Y = reshape(permute(cat(3,X,M),[3,2,1]),8,[]);>> fprintf(' %9d %#9.*g %#15.*g %#15.*g\n',Y(2:end,:)) 1 0.000000 0.000000 0.000000 2 0.000000 0.000000 4.000000 3 0.000000 0.000000 1.000000 4 0.000000 0.000000 2.000000 5 0.000000 11.00000 4.000000 6 0.000000 12.00000 4.000000 7 0.000000 13.00000 4.000000 8 0.000000 14.00000 4.000000 9 0.000000 15.00000 4.000000 10 10.00000 16.00000 4.000000 11 10.00000 17.00000 4.000000 12 0.000000 18.00000 4.000000 13 0.000000 12.00000 0.000000 14 0.000000 11.00000 0.000000 15 0.000000 10.00000 0.000000
Best Answer