Rとjuliaとrubyとpython
行列の取り扱い方
4つの言語の比較の第八弾として,そのきっかけとなった行列の使い方について表にまとめてみた.
| R | julia | ruby | python3 | |
| 初期化 | using LinearAlgebra | require "numo/linalg" | import numpy as np | |
| 定義 | a<-matrix(c(1,3,2,4),2,2) | a=[1 2; 3 4] | a=Numo::NArray[[1,2],[3,4]] | a=np.array([[1,2],[3,4]]) |
| 単位行列 | b<-diag(2) | b=I(2) | b=Numo::DFloat.eye(2) | b=np.eye(2) b=np.identity(2) |
| 対角行列 | d<-diag(c(1,2)) | d=diagm([1,2]) | d=Numo::NArray[1,2].diag | d=np.diag([1,2]) |
| 対角要素 | diag(a) | diag(a) | a.diagonal | np.diag(a) np.diagonal(a) a.diagonal() |
| 型 | dim(a) | size(a) | a.shape | a.shape |
| 要素 | a[1,2] | a[1,2] | a[0,1] | a[0,1] |
| 行 | a[1,] | a[1,:] | a[0,true] | a[0,:] |
| 列 | a[,1] | a[:,1] | a[true,0] | a[:,0] |
| 転置 | t(a) | transpose(a) | a.transpose | a.T a.transpose() |
| 随伴行列 | Conj(t(a)) | a' adjoint(a) | a.transpose.conj | a.T.conjugate() |
| 跡 | sum(diag(a)) | tr(a) | a.trace | a.trace() |
| 行列式 | det(a) | det(a) | Numo::Linalg.det(a) | np.linalg.det(a) |
| 和 | a+b | a+b | a+b | a+b |
| 差 | a-b | a-b | a-b | a-b |
| スカラー倍 | 2*a a*2 | 2*a a*2 | 2*a a*2 | 2*a a*2 |
| 要素毎の積 | a*b | a.*b | a*b | a*b |
| 積 | a%*%b | a*b | Numo::Linalg.matmul(a,b) a.dot(b) | a@b np.matmul(a,b) a.dot(b) |
| 冪乗 | Reduce("%*%",replicate(3,a,FALSE)) | a^3 | Numo::Linalg.matrix_power(a,3) | np.linalg.matrix_power(a,3) |
| 逆行列 | solve(a) | inv(a) I/a a\I | Numo::Linalg.inv(a) | np.linalg.inv(a) |
| 対角化 | eigen(a) | eigen(a) | Numo::Linalg.eig(a) | np.linalg.eig(a) |
| 固有値 | eigen(a)$values | eigvals(a) | Numo::Linalg.eigvals(a) | np.linalg.eigvals(a) |
| 固有ベクトル | eigen(a)$vectors | eigvecs(a) | Numo::Linalg.eigvecs(a) | np.linalg.eig(a)[1] |
module Numo
class NArray
alias_method :tr, :trace
alias_method :t, :transpose
def determinant()
Numo::Linalg.det(self)
end
alias_method :det, :determinant
def inverse()
Numo::Linalg.inv(self)
end
alias_method :inv, :inverse
def eig()
Numo::Linalg.eig(self)
end
alias_method :eigensystem, :eig
alias_method :eigen, :eigensystem
class << self
alias_method :identity, :eye
alias_method :unit, :identity
alias_method :I, :identity
end
end
end
numoに組み込んでもらえないかな.githubに登録して意見を投稿すれば可能性はあるかも知れないけど,難しいかな.