2022年
5月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

setup diary

2007|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|06|08|11|
2015|01|02|03|04|05|06|07|08|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|

2022-05-13 Rとjuliaとrubyとpython

_ 行列の取り扱い方

4つの言語の比較の第八弾として,そのきっかけとなった行列の使い方について表にまとめてみた.
Rjuliarubypython3
初期化 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+ba+ba+ba+b
a-ba-ba-ba-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]
インストールの仕方などは,3/7に書いたので,ここでは省略する.こうやってまとめてみると,rubyのMatrixのコマンドと,numo/linalgの行列のコマンドはかなり違う気がする.そこで,同じようなコマンドを使えるようにするために,以下のスクリプトを書いてみた.
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に登録して意見を投稿すれば可能性はあるかも知れないけど,難しいかな.