Format Array column in fprintf

8 ビュー (過去 30 日間)
Trang Hu Jia
Trang Hu Jia 2020 年 10 月 27 日
編集済み: Stephen23 2020 年 10 月 28 日
Hello everyone,
I have used the command fprintf to write the data in .dat file
but the result give me as
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 10.000000 16.000000 4.000000
11 10.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 etc.
How to re-format to get
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 etc.
  1 件のコメント
Sudhakar Shinde
Sudhakar Shinde 2020 年 10 月 27 日
check formatspec with frpintf.

サインインしてコメントする。

採用された回答

Stephen23
Stephen23 2020 年 10 月 27 日
編集済み: Stephen23 2020 年 10 月 27 日
The short answer is: not easily.
Your output example has varying numbers of fractional digits
0.000000 % six decimal places
4.000000 % six decimal places
11.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
  3 件のコメント
Stephen23
Stephen23 2020 年 10 月 28 日
編集済み: Stephen23 2020 年 10 月 28 日
"How to fixed it ?"
What MATLAB version are you using?
If you are using Octave then note that it counts significant digits incorrectly for zero:
>> fprintf('%#.3g\n',[0,1,9])
0.00
1.00
9.00
in which case you can simply do this:
>> fprintf(' %9d %#9.7g %#15.7g %#15.7g\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.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 0.000000 16.00000 4.000000
11 0.000000 17.00000 4.000000
12 0.000000 18.00000 4.000000
Trang Hu Jia
Trang Hu Jia 2020 年 10 月 28 日
I got the result already, thank you very much for your help.
This code is very helpful for me
Thanks again!!

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeLogical についてさらに検索

タグ

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by