行列による一次変換の図を描く
二次元平面上の点が行列による変換によってどこに移動するか?それをXY座標にプロットする図を作りたい。Rで描いて、EPS画像にして取り込む事ができないか?
図をEPS ファイルに書き出すのは、dev.copy2eps( file = "file_name.eps" )という命令でできるようだ。
この図はx座標、y座標ともに−5から5までの値を取る黒丸の点が、行列Xによってどこに移されたかを示したものである。
以下のコードがRでのコード。対象行列を作って、行列のかけ算をして、新しい行列と前の行列の座標間を矢印で結んだもの。
#関数の定義 matrix_plot <- function(P,n){ #対象行列の作成 for( j in -n : n){ for( i in -n : n){ if ((i == -n ) && (j == -n)) { x <- c(i,j) } else { x <- append(x,c(i,j)) } } } x <- matrix(x,nrow=2) #X2=PXの計算 x2 <- P %*% x #新しい図を描く plot.new() if (min(x) > min(x2)) { minP <- min(x2) } else { minP <- min(x)} if (max(x) > max(x2)) { maxP <- max(x) } else { maxP <- max(x2)} plot(minP:maxP,minP:maxP,type="n",ann=F) grid() axis(1,pos=0,at=minP:maxP,labels=F) axis(2,pos=0,at=minP:maxP,labels=F) #点と矢印を描く n2 <- (2*n+1)*(2*n+1) for( i in 1:n2 ){ points(x[1,i],x[2,i],pch=20) points(x2[1,i],x2[2,i],pch=16,col="red") if( (x[1,i] != x2[1,i]) || (x[2,i] != x2[2,i]) ){ arrows(x[1,i],x[2,i],x2[1,i],x2[2,i],length=0.1,col="red") } } } #データディレクトリの変更 setwd("D://temp") #行列の生成 P <- matrix(c(3,2,2,3),nrow=2) matrix_plot(P,2) #EPSファイルの生成 dev.copy2eps( file = "file_name.eps",family="AvantGarde")