裏 RjpWiki

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

Julia に翻訳--149 マハラノビスの距離

2021年04月02日 | ブログラミング

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

マハラノビスの距離
http://aoki2.si.gunma-u.ac.jp/R/mahalanobis.html

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

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

mean(x, dims=1) の結果を使うときには注意が必要な場合がある。

==========#

using Statistics, Rmath, LinearAlgebra, Printf

function mahalanobis(dat, x)
    n, p = size(dat)
    m = size(x, 1)
    invss = inv(cov(dat, corrected=false))
    dif = x .- mean(dat, dims=1)
    d2 = [transpose(dif[i, :]) * invss * dif[i, :] for i = 1:m]
    P = pchisq.(d2, p, false)
    @printf("  No.  %12s  %12s\n", "d2", "P")
    for i = 1:m
        @printf("%5d  %12.8g  %12.8f\n", i, d2[i], P[i])
    end
    Dict(:d2 => d2, :P => P)
end

dat = [
    1 2 5 3
    7 4 8 5
    5 4 7 1
    2 3 5 4
    9 5 4 7
    2 1 4 2
    5 4 7 4
    2 3 5 7
    4 1 8 2
    3 2 5 8
    3 5 4 8]

x = [1 2 5 3
     3 1 4 1]

mahalanobis(dat, x)

#   No.            d2             P
#     1     2.0007074    0.73562876
#     2     8.6371948    0.07083601

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

え〜〜,Julia で競技プログラムにおける標準入力からの入力法ですか?

2021年04月02日 | ブログラミング

基本を組み合わせればなんてことないような。

標準入力(キーボード)から文字列として一行分を入力

a = readline()

# "abc def" を入力すると

# a は "abc def"

標準入力(キーボード)から文字列として一行分を入力し,空白文字などで区切って一次元配列に入力

b = split(readline())


# "abcd efg" を入力すると

# b は
# 2-element Array{SubString{String},1}:
#  "abcd"
#  "efg"

標準入力(キーボード)から整数を 1 個入力

c = parse(Int, readline())

# "12345" を入力すると

# c は 整数 12345

標準入力(キーボード)から実数を 1 個入力

d = parse(Float64, readline())


# "3.14159" を入力すると

# d は 実数 3.14159

標準入力(キーボード)から複数の整数を複数の変数へ入力

e, f, g = parse.(Int, split(readline()))

# "12 345 678" を入力すると
# e は 整数 12,f は 整数 345, g は 整数 6789

標準入力(キーボード)から複数の整数を1次元配列(ベクトル)へ入力

h = parse.(Int, split(readline()))


# "12 345 678" を入力すると

# h は
# 3-element Array{Int64,1}:
#   12
#  345
#  678

長さ n の実数ベクトル x, y, z の要素 x[i], y[i], z[i] が一行に 3 個ずつ,n 行分入力

n = parse(Int, readline())
x = zeros(n) # zeros() である必要はないが
y = similar(x)
z = similar(x)
for i = 1:n
    x[i], y[i], z[i] = parse.(Float64, split(readline()))
end

# 4 行入力する
# "3"
# "1.1 1.2 1.3"
# "2.1 2.2 2.3"
# "3.1 3.2 3.3"
# 結果
# x は
# 3-element Array{Float64,1}:
#  1.1
#  2.1
#  3.1
# y は
# 3-element Array{Float64,1}:
#  1.2
#  2.2
#  3.2
#
# z は
# 3-element Array{Float64,1}:
#  1.3
#  2.3
#  3.3

整数 n, m を入力する
"3 7"

n 行 m 文字を入力して
"0101100"
"1110010"
"0101011"

n 行 m 列の "0"/"1" 文字列行列にする
"0" "1" "0" "1" "1" "0" "0"
"1" "1" "1" "0" "0" "1" "0"
"0" "1" "0" "1" "0" "1" "1"

n, m = parse.(Int, split(readline()))
s = fill("", n, m)
for i = 1:n
    s[i, :] = split(readline(), "")
end

# これにより, s は以下のようになる
# 3×7 Array{String,2}:
#  "0"  "1"  "0"  "1"  "1"  "0"  "0"
#  "1"  "1"  "1"  "0"  "0"  "1"  "0"
#  "0"  "1"  "0"  "1"  "0"  "1"  "1"

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村