Robin Hankin wrote:
Hello everybody.

I am trying to reproduce a particular matrix in an elegant way.  If I
have

jj1 <-
structure(c(1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,
3,1,2,3,1,2,3,1,2,3,2,3,1,2,3,1,2,3,1,2,3,
1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,3,1,2,3,1,
2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,
2),.Dim = as.integer(c(9,9)))

[ image(jj1) is good here ] then I can get this with

kronecker(matrix(1,3,1),kronecker(1+outer(0:2,0:2,"+")%%3,matrix(1,1,3)))

I want to reproduce the following matrices in an equivalent way:

jj2 <- matrix(c(1,2,3,1,2,3,1,2,3,2,3,1,2,3,1,2,3,1,
1,2,3,1,2,3,1,2,3,3,1,2,3,1,2,3,1,2,1,2,3,1,2,
3,1,2,3,3,1,2,3,1,2,3,1,2,2,3,1,2,3,1,2,3,1,3,
1,2,3,1,2,3,1,2,2,3,1,2,3,1,2,3,1),9,9)

jj3 <- structure(c(1,2,3,2,3,1,3,1,2,1,2,1,2,3,2,3,1,
3,1,3,1,2,1,2,3,2,3,2,3,1,3,1,2,1,2,3,2,3,
2,3,1,3,1,2,1,2,1,2,3,2,3,1,3,1,3,1,2,1,2,
3,2,3,1,3,1,3,1,2,1,2,3,2,3,2,3,1,3,1,2,1, 2),.Dim =
as.integer(c(9,9)))


some musings. You have not told us hove jj3 arises naturally, but its structure seems to have something to do with magic squares. So


library(magic) # on CRAN
is.magic(jj3) # TRUE
This is not in accordance with my concept of magic squares, since an n*n magic square should have all the numbers from 1 to n^2 exactly once. But all rowSums and colSums are equal.


Note that if we view jj3 as a 3*3 block matrix, with each block
a 3*3 matrix, then all the blockx are generated rowwise the following way: Let x in 1:3 be the generator, and + be sum modulo 3, but we take the rep 3 and not 0.
Then we have


x       x        x
x+1     x+1      x+2
x+2     x        x

and the 3*3 matrix of the generators can be generated in the following way:

> xx <- ((magic(3) %% 3)+1)[,3:1]
> xx
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    2    3    1
[3,]    3    1    2

> "++" <- function(x,a) {
       if ( (x+a)%%3 == 0 ) 3 else (x+a) %% 3 }

> makeBlock <- function(x) {
+    matrix( c( rep(x,3), rep("++"(x,1), 2), rep("++"(x,2), 2),
+               rep(x,2) ) , 3,3, byrow=TRUE)  }
> makeBlock(1)
     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    2    2    3
[3,]    3    1    1

> ans <- matrix (NA,9,9)
> for (i in 1:3) for (j in 1:3) {
+   ans[3*(i-1)+1:3, 3*(j-1)+1:3] <- makeBlock(xx[i,j]) }
> ans
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
 [1,]    1    1    1    2    2    2    3    3    3
 [2,]    2    2    3    3    3    1    1    1    2
 [3,]    3    1    1    1    2    2    2    3    3
 [4,]    2    2    2    3    3    3    1    1    1
 [5,]    3    3    1    1    1    2    2    2    3
 [6,]    1    2    2    2    3    3    3    1    1
 [7,]    3    3    3    1    1    1    2    2    2
 [8,]    1    1    2    2    2    3    3    3    1
 [9,]    2    3    3    3    1    1    1    2    2
> ans ==jj3
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
 [1,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
 [2,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
 [3,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
 [4,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
 [5,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
 [6,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
 [7,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
 [8,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
 [9,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE


Kjetil Halvorsen



[ note that jj1-jj3 each have precisely 3 occurrences of A, B, and C
along each row, column and (broken) diagonal ].

Can anyone give me a nice elegant way of creating jj2 and jj3 please?


______________________________________________ [EMAIL PROTECTED] mailing list https://www.stat.math.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html

Reply via email to