配列の出力(print)

ある2次元配列 ϕ (Array{T,2} where T<:Float64 とか) を,フォーマット指定して出力することを考える.

フォーマットにこだわりがなければ…

良いfunctionがあることを教えてもらった.
Juialang: print 入門 - Hello World から pretty-print まで - (Qiita)
Base.print_arrayで配列を出力ができる.1カラムの幅は自動で揃うようになっている.下記はファイルに出力するときの例.

open("out.txt","w") do file
    Base.print_array(file, ϕ)
end

空白区切りでもよく,浮動小数点数の桁を気にする必要がなければ,これ以下は特に読む必要はない.

Matrixで出力

ϕ11,ϕ12,ϕ13 ... ϕ1m
ϕ21,ϕ22,ϕ23 ... ϕ2m
ϕ31,ϕ32,ϕ33 ... ϕ3m
...
ϕn1,ϕn2,ϕn3 ... ϕnm

と行列の見たまま(数字は行列の添字を表す),かつ小数点以下の桁数を揃えて固定長でprintしたいときは,

using Printf
[[map(ϕ[i,:]) do j; @printf("%8.3f,",j); end; @printf("\n");] for i=1:size(ϕ,1)]

のようにすればOK. iは行でjは列を表している. mapの代わりにbroadcastを使っても良い.
カンマ区切りではなくて空白区切りが良い場合は "%8.3f," を "%8.3f " に変えよう.
上の操作は標準出力の場合であり,ファイルへ出力する場合は@printfの部分にIOStreamを入れる.あとは変更の必要なし.

# ファイル展開, 行列 出力例
# formatは %e
open( "tmp.txt", "w" ) do fileIO
    [[map(ϕ[i,:]) do j; @printf(fileIO,"%11.3e,",j); end; @printf(fileIO,"\n");] for i=1:size(ϕ,1)]
end

若干面倒な書き方なので,もっとスマートな方法があったら知りたい.
見つかるまではこれでマクロかfunctionを作っておく.

3-columnのVectorで出力

x11, y11, ϕ11
x21, y21, ϕ21
x31, y31, ϕ31
...
x12, y12, ϕ12
x22, y22, ϕ22
x32, y32, ϕ32
...
xnm, ynm, ϕnm

のように縦長に変数ごとに3列で出力する場合は下記の通り.

# ファイル展開, 3列 出力例
open( "tmp.txt", "w" ) do fileIO
   [@printf(fileIO, "%8.3f %8.3f %11.3e\n", x[k],y[k],ϕ[k]) for k=1:length(ϕ[:])]
end

@printfのformat指定は,直接文字列""を入力する以外の方法ではエラーになった(String変数ではだめだった).
ただし@evalを使うとできることがわかった.@printg(@sprintf)のフォーマットに記載.


Front page   Edit Diff Attach Copy Rename Reload   New List of pages Search Recent changes   Help   RSS of recent changes
Last-modified: 2018-11-03 (Sat) 02:34:10 (16d)