簡體   English   中英

如何使用 for 循環在 R 中構建具有模塊化模式的矩陣?

[英]How can I use for loops to construct a matrix with a modular pattern in R?

我想要一個 (q^p) xp 矩陣,其中 q 是一個素數。

如果 q=3, p=3,我想構建如下模式:

0  0  0
1  0  0
2  0  0
0  1  0
1  1  0
2  1  0
0  2  0
1  2  0
2  2  0
0  0  1
1  0  1
2  0  1
0  1  1
1  1  2
0  2  1
0  0  2
1  0  2
2  0  2
0  1  2
1  1  2
0  2  2
1  2  2
2  2  2

我到目前為止的代碼是:

  F <- matrix(ncol=p,nrow=q^p) #initialize the vector F
  for(i in 1:(q^p)){
    for(j in 1:p){  
      F[i,j] <- ((i-1) %% q) * (j %% 3)
    }
  }

如果另一個例子有幫助,下面是 aq=2, p=3 矩陣的樣子:

0  0  0
1  0  0
0  1  0
1  1  0
0  0  1
1  0  1
0  1  1
1  1  1

我知道我需要使用一些模塊化功能,但我不確定如何解決這個問題。

使用expand.grid

f = function(q, p) {
  as.matrix(expand.grid(replicate(p, 1:q-1L, FALSE)))
}


f(2,3)
#      Var1 Var2 Var3
# [1,]    0    0    0
# [2,]    1    0    0
# [3,]    0    1    0
# [4,]    1    1    0
# [5,]    0    0    1
# [6,]    1    0    1
# [7,]    0    1    1
# [8,]    1    1    1

f(3,3)
#      Var1 Var2 Var3
# [1,]    0    0    0
# [2,]    1    0    0
# [3,]    2    0    0
# [4,]    0    1    0
# [5,]    1    1    0
# [6,]    2    1    0
# [7,]    0    2    0
# [8,]    1    2    0
# [9,]    2    2    0
# [10,]    0    0    1
# [11,]    1    0    1
# [12,]    2    0    1
# [13,]    0    1    1
# [14,]    1    1    1
# [15,]    2    1    1
# [16,]    0    2    1
# [17,]    1    2    1
# [18,]    2    2    1
# [19,]    0    0    2
# [20,]    1    0    2
# [21,]    2    0    2
# [22,]    0    1    2
# [23,]    1    1    2
# [24,]    2    1    2
# [25,]    0    2    2
# [26,]    1    2    2
# [27,]    2    2    2

這會為每個序列計算一次迭代,然后依靠循環來填充長度。

foo = function(p, q) {
  seqs = lapply(1:p, function(x) rep((1:q) - 1, each = q^(x - 1)))
  do.call(cbind, seqs)
}

> foo(3, 2)
     [,1] [,2] [,3]
[1,]    0    0    0
[2,]    1    0    0
[3,]    0    1    0
[4,]    1    1    0
[5,]    0    0    1
[6,]    1    0    1
[7,]    0    1    1
[8,]    1    1    1

這是伽羅瓦場表征的另一種方法(但不像@Gregor Thomas的方法那么簡單)

gf <- function(q,p) {
  x <- seq(q**p)-1
  t(sapply(x, function(v) {
    if (v==0) {
      r <- 0
    } else {
      r <- c()
      while (v!=0) {
        r <- c(v%%q,r)
        v <- v%/%q 
      }
    }
    c(rep(0,p-length(r)),r)}))
}

這樣

> q <- 3

> p <- 3

> gf(p,q)
      [,1] [,2] [,3]
 [1,]    0    0    0
 [2,]    0    0    1
 [3,]    0    0    2
 [4,]    0    1    0
 [5,]    0    1    1
 [6,]    0    1    2
 [7,]    0    2    0
 [8,]    0    2    1
 [9,]    0    2    2
[10,]    1    0    0
[11,]    1    0    1
[12,]    1    0    2
[13,]    1    1    0
[14,]    1    1    1
[15,]    1    1    2
[16,]    1    2    0
[17,]    1    2    1
[18,]    1    2    2
[19,]    2    0    0
[20,]    2    0    1
[21,]    2    0    2
[22,]    2    1    0
[23,]    2    1    1
[24,]    2    1    2
[25,]    2    2    0
[26,]    2    2    1
[27,]    2    2    2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM