裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

Julia に翻訳--227 C 曲線

2021年05月13日 | ブログラミング

#==========
Julia の修行をするときに,いろいろなプログラムを書き換えるのは有効な方法だ。
以下のプログラムを Julia に翻訳してみる。

C 曲線
https://blog.goo.ne.jp/r-de-r/e/f5aa8e4436033d181824365a32640b91

ファイル名: drawC.jl  関数名:

翻訳するときに書いたメモ

これも,奥村先生のプログラムを参考に書いたもののはず。アルゴリズム辞典の表紙に描いてあった。

R での実行を観察すると,線分を逐次描いている様子がわかる。しかしこれがネックで,DrawCmain1 はとてつもなく実行時間がかかる。
R ではさほどでもないのだが,Julia では,ハングアップしたかと思うほど。plot!() の呼出にコストが掛かっているのだ。

n が 1 増えると,実行時間は 4 倍くらいになるのかな。
そこで,線分の座標のみを蓄積して,最後に一度だけ plot!() するようにすれば爆速になった。
n = 13 のときには,2000 倍ということだ。

drawCmain1(0, 4, 0, -4, 11) #   7.971522
drawCmain1(0, 4, 0, -4, 12) #  33.294714
drawCmain1(0, 4, 0, -4, 13) # 159.953883

drawCmain2(0, 4, 0, -4, 11) #   0.049090
drawCmain2(0, 4, 0, -4, 12) #   0.063444
drawCmain2(0, 4, 0, -4, 13) #   0.081188 単位 sec.
==========#

using Plots

function drawCmain1(ax, ay, bx, by, n)
    function drawC(ax, ay, bx, by, n)
        x = bx-ax
        y = ay-by
        z = (x-y)/2
        cx = ax+z
        cy = by-z
        if n == 0
            plot!([ax, cx, bx], [ay, cy, by])
        else
            drawC(ax, ay, cx, cy, n-1)
            drawC(cx, cy, bx, by, n-1)
        end
    end

    gr(grid=false, showaxis=false, color=:red, ticks=false,
        aspect_ratio=1, label=false)
    plt = plot(xlims=(-8, 4), ylims=(-8, 8));
    drawC(ax, ay, bx, by, n) # 0, 4, 0, -4, 14
    savefig("drawc.png")
    display(plt)
end

drawCmain1(0, 4, 0, -4, 11)


using Plots

function drawCmain2(ax, ay, bx, by, n)
    function drawC(ax, ay, bx, by, n)
        x = bx-ax
        y = ay-by
        z = (x-y)/2
        cx = ax+z
        cy = by-z
        if n == 0
            append!(savedx, [ax, cx, bx])
            append!(savedy, [ay, cy, by])
        else
            drawC(ax, ay, cx, cy, n-1)
            drawC(cx, cy, bx, by, n-1)
        end
    end

    gr(grid=false, showaxis=false, color=:red, ticks=false,
        aspect_ratio=1, label=false)
    plt = plot(xlims=(-8, 4), ylims=(-8, 8));
    savedx = []
    savedy = []
    drawC(ax, ay, bx, by, n) # 0, 4, 0, -4, 14
    plot!(savedx, savedy)
    savefig("drawc.png")
    display(plt)
end

drawCmain2(0, 4, 0, -4, 15)

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« Julia に翻訳--225 主成分回帰 | トップ | Julia の小ネタ--024 QR 分解 »
最新の画像もっと見る

コメントを投稿

ブログラミング」カテゴリの最新記事