配列の出力(print)

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

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

Base.print_array で配列の出力ができる.
幅は自動で揃うようになっている.下記はファイルに出力するときの例.

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

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

Matrixで出力

【2020年1月 若干修正】

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

のように(数字は行列の添字を表す),行列の見たままファイルへ print したいときは,

using Printf
open( "matrix_out.csv", "w" ) do fileIO
    [(if j != m
          @printf(fileIO, "%11.3e,", ϕ[i,j]) # 最後の列以外.カンマ区切り
      else
          @printf(fileIO, "%11.3e\n", ϕ[i,j]) # 最後の列で改行
      end) for j=1:m, i=1:n]
end

若干面倒な書き方なので,もっとスマートな方法があったら知りたい.

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: 2020-01-30 (Thu) 09:40:19 (1708d)