INFINITY -数学とかプログラミングとか-

統計とプログラムを使って役に立たせたい

TeX用コマンド入力を支援するための辞書をご利用ください。
sanctuary's blogは,適当なことが書いてあります。

Rotateしたい.

Rの方が簡単に書ける(他に書けんの(ry )ので、気晴らしにコードを描いてみた。

まず,特定のドミノを一箇所回転するrt関数を作成した.例えば,rt(x1,x2)で(x1,x2)を局所変形できる.".csv"で保存してくれる.(同じ要素を指定すると上書きしてしまうので注意が必要)


読み込みたい行列.csvは、
例えば、http://infinity.me.land.to/project/rotatematrix01.csv
を使う。

#Copyright(c) Hiroshi Tashiro

#作業ディレクトリ

setwd("ディレクトリを指定")

#絶対パスでファイルを指定。

mat=read.csv("読み込みたい行列.csv",sep=",",header=FALSE)

m=nrow(mat);n=ncol(mat)#行、列の数


#mat=t(mat)#転置して上の行列を行列を表示
rmat=mat#rmatは、回転したい行列

mat

rt=function(i,j){
	cat("Current field:",i,",",j,"\n")
	#print rotate matrix
	cat("Rotate matrix:\n")
	for(k in 1:m){
		for(l in 1:n){
			cat(sprintf("%2d,",rmat[k,l]))
		}
		cat("\n")
	}

	#列方向,行方向で一致するタイルをみつける
	if(((rmat[i,j]==rmat[(i+1),j])&&(rmat[i,(j+1)]==rmat[(i+1),(j+1)]))
	 ||((rmat[i,j]==rmat[i,(j+1)])&&(rmat[(i+1),j]==rmat[(i+1),(j+1)]))){
		cat("Find!\n")
		#変換部分の行列を取り出す
		rotateSubMat=rmat[i:(i+1),j:(j+1)]
			
		k=1
		cat(rotateSubMat[k,k],",",rotateSubMat[k,k+1],"\n")
		cat(rotateSubMat[k+1,k],",",rotateSubMat[k+1,k+1],"\n")

		#変換したいなら、転置する
		rotateSubMat=t(rotateSubMat)
		cat("Rotated!\n")
		for(k in 1:2){
			for(l in 1:2){
				rmat[i+(k-1),j+(l-1)]<<-rotateSubMat[k,l]#grobal variableを書き換える
			}
		}
			
		#print rotated matrix

		for(k in 1:m){
			for(l in 1:n){
				cat(sprintf("%2d,",rmat[k,l]))#桁揃え
				#cat(sprintf("%.2d,",rmat[k,l]))#1桁なら0をつける

			}
			cat("\n")
		}
		cat("\n")
		#matchedTileMat=matrix(c(rmat[i,j],rmat[i+1,j+1]),2,)
		#行を指定してその後に次々にデータを書き込みたい。できないのか?
		#上書きしてしまうので、if文で書こう!ファイルが存在してたら、別名で。
		filename=paste("rotatedmat",i,",",j,".csv")#変数の前に空半角が入る(?)
		write.csv(rmat, filename, row.names=FALSE)
	}else cat("Can't rotate!\n")
}

1,1を局所変形したいとき,以下のようにする.変形できない部分を指定すると,Can't rotate!とでる。

> rt(1,1)
Current field: 1 , 1
Rotate matrix:
1, 3, 6, 6,15,21,21,29,
1, 3, 7, 7,15,22,23,29,
2, 4, 4, 8,14,22,23,30,
2, 5, 5, 8,14,24,24,30,
9,10,10,12,13,25,25,31,
9,11,11,12,13,26,26,31,
16,16,18,18,20,27,28,32,
17,17,19,19,20,27,28,32,
Find!
1 , 3
1 , 3
Rotated!
1, 1, 6, 6,15,21,21,29,
3, 3, 7, 7,15,22,23,29,
2, 4, 4, 8,14,22,23,30,
2, 5, 5, 8,14,24,24,30,
9,10,10,12,13,25,25,31,
9,11,11,12,13,26,26,31,
16,16,18,18,20,27,28,32,
17,17,19,19,20,27,28,32,


次に、与えられた行列(matに指定したもの)を順番に(1,1),(2,1),(3,1),(2,1),(2,2)などを変形するコードである.

大きい行列は、手打ちが('A`)マンドクセので、可愛らしい4×4のmatrixにした。
つか、行列を変えたいならmatの部分を変えればいいだけだ。(ぇ(´ぅω・`)

#Copyright(c) Hiroshi Tashiro
m=4;n=4

mat=matrix(c(1,3,6,6,
		 1,3,7,7,
		 2,4,4,8,
		 2,5,5,8)
		,m,n)

mat=t(mat)#転置して上の行列を表示
mat

#変換したい行列の(1,1)を、元の行列の行と列番号を指定
mat[1:2,1:2]

#変換部分の行列を取り出す
rotateMat=mat[i:(i+1),j:(j+1)]
rotateMat

#変換したいなら、転置する
rotateMat=t(rotateMat)
rotateMat


#変換可能な部分行列を検出
for(i in 1:(m-1)){
	for(j in 1:(n-1)){
		#i=i+1;j=j+1
		cat("Current field:",i,",",j,"\n")
		#cat(mat[(i+1),j],",",mat[(i+1),j],",",mat[i,(j+1)],",",mat[(i+1),(j+1)],"\n")
		#列方向,行方向で一致する部分行列をみつける
		if(((mat[i,j]==mat[(i+1),j])&&(mat[i,(j+1)]==mat[(i+1),(j+1)]))
		 ||((mat[i,j]==mat[i,(j+1)])&&(mat[(i+1),j]==mat[(i+1),(j+1)]))){
			cat("Find!\n")
			#変換部分の行列を取り出す
			rotateSubMat=mat[i:(i+1),j:(j+1)]
			
			k=1
			cat(rotateSubMat[k,k],",",rotateSubMat[k,k+1],"\n")
			cat(rotateSubMat[k+1,k],",",rotateSubMat[k+1,k+1],"\n")

			#変換したいなら、転置する
			rotateSubMat=t(rotateSubMat)
			#cat(rotateSubMat,"\n")
			cat("Rotated!\n")
			for(k in 1:2){
				for(l in 1:2){
				mat[i+(k-1),j+(l-1)]=rotateSubMat[k,l]
				}
			}
			
			#print rotated matrix

			for(k in 1:m){
				for(l in 1:n){
					cat(mat[k,l],",")
				}
				cat("\n")
			}
			

			cat("\n")
			matchedTileMat=matrix(c(mat[i,j],mat[i+1,j+1]),2,)
		}
	}
}

> m=4;n=4
>
> mat=matrix(c(1,3,6,6,

  1. 1,3,7,7,
  2. 2,4,4,8,
  3. 2,5,5,8)
  4. ,m,n)

>
> mat=t(mat)#転置して上の行列を行列を表示
> mat
[,1] [,2] [,3] [,4]
[1,] 1 3 6 6
[2,] 1 3 7 7
[3,] 2 4 4 8
[4,] 2 5 5 8


Current field: 1 , 1
Find!
1 , 3
1 , 3
Rotated!
1 ,1 ,6 ,6 ,
3 ,3 ,7 ,7 ,
2 ,4 ,4 ,8 ,
2 ,5 ,5 ,8 ,

Current field: 1 , 2
Current field: 1 , 3
Find!
6 , 6
7 , 7
Rotated!
1 ,1 ,6 ,7 ,
3 ,3 ,6 ,7 ,
2 ,4 ,4 ,8 ,
2 ,5 ,5 ,8 ,

Current field: 2 , 1
Current field: 2 , 2
Current field: 2 , 3
Current field: 3 , 1
Current field: 3 , 2
Find!
4 , 4
5 , 5
Rotated!
1 ,1 ,6 ,7 ,
3 ,3 ,6 ,7 ,
2 ,4 ,5 ,8 ,
2 ,4 ,5 ,8 ,

Current field: 3 , 3
Find!
5 , 8
5 , 8
Rotated!
1 ,1 ,6 ,7 ,
3 ,3 ,6 ,7 ,
2 ,4 ,5 ,5 ,
2 ,4 ,8 ,8 ,



全パターンを表示するには、この方法は、よろしくない。つまり、僕はアホだ。