2012-06-02 164 views
0

給出矩陣M和具有不同可能值的較小矩陣,我試圖列出將這些小矩陣的組合疊加到矩陣M中產生的所有可能矩陣。小矩陣是插入到具有相同行/列名稱的M的位置中。將小矩陣粘貼到大矩陣中的所有可能矩陣

例如,假設有:

M <- matrix(rep(0, 49), nrow =7, ncol =7) 
rownames(M) <- colnames(M) <-seq(1,7) 
> M 
1 2 3 4 5 6 7 
1 0 0 0 0 0 0 0 
2 0 0 0 0 0 0 0 
3 0 0 0 0 0 0 0 
4 0 0 0 0 0 0 0 
5 0 0 0 0 0 0 0 
6 0 0 0 0 0 0 0 
7 0 0 0 0 0 0 0 

# Generate first set of small matrices: 
sub_mat_1_1 <- matrix(rep(1, 9), nrow =3, ncol =3) 
rownames(sub_mat_1_1) <- colnames(sub_mat_1_1) <- c(2,3,5) 
sub_mat_1_2 <- matrix(rep(2, 9), nrow =3, ncol =3) 
rownames(sub_mat_1_2) <- colnames(sub_mat_1_2) <- c(2,3,5) 
sub_mat_1_3 <- matrix(rep(3, 9), nrow =3, ncol =3) 
rownames(sub_mat_1_3) <- colnames(sub_mat_1_3) <- c(2,3,5) 
submatrix_1 <- list(sub_mat_1_1, sub_mat_1_2, sub_mat_1_3) 

# Generate second set of small matrices: 
submatrix_2 <- list() 
sub_mat_2_1 <- matrix(rep(1, 4), nrow =2, ncol =2) 
rownames(sub_mat_2_1) <- colnames(sub_mat_2_1) <- c(1,6) 
sub_mat_2_2 <- matrix(rep(2, 4), nrow =2, ncol =2) 
rownames(sub_mat_2_2) <- colnames(sub_mat_2_2) <- c(1,6) 
submatrix_2 <- list(sub_mat_2_1, sub_mat_2_2) 

# Generate list of small matrices: 
submatrices <- list() 
submatrices[[1]] <- submatrix_1 
submatrices[[2]] <- submatrix_2 

[[1]] 
[[1]][[1]] 
    2 3 5 
2 1 1 1 
3 1 1 1 
5 1 1 1 

[[1]][[2]] 
    2 3 5 
2 2 2 2 
3 2 2 2 
5 2 2 2 

[[1]][[3]] 
    2 3 5 
2 3 3 3 
3 3 3 3 
5 3 3 3 


[[2]] 
[[2]][[1]] 
    1 6 
1 1 1 
6 1 1 

[[2]][[2]] 
    1 6 
1 2 2 
6 2 2 

由於有3種可能性用於第二第一小矩陣集和2中,我試圖輸出,而無需使用一個for循環中,所有6點可能的矩陣作爲列表:

[[1]] 
    1 2 3 4 5 6 7 
1 1 0 0 0 0 1 0 
2 0 1 1 0 1 0 0 
3 0 1 1 0 1 0 0 
4 0 0 0 0 0 0 0 
5 0 1 1 0 1 0 0 
6 1 0 0 0 0 1 0 
7 0 0 0 0 0 0 0 

[[2]] 
    1 2 3 4 5 6 7 
1 1 0 0 0 0 1 0 
2 0 2 2 0 2 0 0 
3 0 2 2 0 2 0 0 
4 0 0 0 0 0 0 0 
5 0 2 2 0 2 0 0 
6 1 0 0 0 0 1 0 
7 0 0 0 0 0 0 0 

[[3]] 
    1 2 3 4 5 6 7 
1 1 0 0 0 0 1 0 
2 0 3 3 0 3 0 0 
3 0 3 3 0 3 0 0 
4 0 0 0 0 0 0 0 
5 0 3 3 0 3 0 0 
6 1 0 0 0 0 1 0 
7 0 0 0 0 0 0 0 

[[4]] 
    1 2 3 4 5 6 7 
1 2 0 0 0 0 2 0 
2 0 1 1 0 1 0 0 
3 0 1 1 0 1 0 0 
4 0 0 0 0 0 0 0 
5 0 1 1 0 1 0 0 
6 2 0 0 0 0 2 0 
7 0 0 0 0 0 0 0 

[[5]] 
    1 2 3 4 5 6 7 
1 2 0 0 0 0 2 0 
2 0 2 2 0 2 0 0 
3 0 2 2 0 2 0 0 
4 0 0 0 0 0 0 0 
5 0 2 2 0 2 0 0 
6 2 0 0 0 0 2 0 
7 0 0 0 0 0 0 0 

[[6]] 
    1 2 3 4 5 6 7 
1 2 0 0 0 0 2 0 
2 0 3 3 0 3 0 0 
3 0 3 3 0 3 0 0 
4 0 0 0 0 0 0 0 
5 0 3 3 0 3 0 0 
6 2 0 0 0 0 2 0 
7 0 0 0 0 0 0 0 

一般情況下,我可以有n個給定的「小矩陣表」,每個都有自己的數字矩陣。我如何在這種情況下使用apply類型的函數?

+1

你有沒有考慮過你的問題含糊不清的可能性?我不明白你爲什麼認爲列表中的4個矩陣(或6個)是一個詳盡列舉M的「子矩陣」的例子。事實上,他們甚至不會出現「M」的真正子矩陣,因爲M全爲零。 –

+0

我想我的術語是不正確的,謝謝你讓我知道!簡單地說:我有一個大矩陣M和更小的矩陣,我想從中產生所有可能的小矩陣組合成M的混合。我的問題是如何在不使用for循環的情況下執行此操作。 – SAT

+0

您沒有提及這些膠合是否需要保留元素的鄰接關係,或者子矩陣是否需要是方形的。你提供的例子受到各種解釋的影響,但看起來子矩陣需要是正方形的,但是它們可以放回非鄰近位置的大矩陣中。所有猜測,因爲你沒有采用標準的數學術語。 –

回答

1

這給出了要求的輸出,但我必須同意評論者的問題不是很好。你如何定義子矩陣的值插入的位置?我只是假設你希望它們插入行和列的特定子集中,如所請求的輸出所示...

將兩個矩陣插入指定的行/列M(全局定義,可能是不好的做法)

tmpmatf <- function(m1,m2,rc1=c(2,3,5),rc2=c(1,6)) { 
    pos1 <- as.matrix(expand.grid(rc1,rc1)) 
    pos2 <- as.matrix(expand.grid(rc2,rc2)) 
    M[pos1] <- m1 
    M[pos2] <- m2 
    M 
} 

現在使用expand.grid創建具有從子矩陣的每一個列表索引的所有組合的數據幀,並使用alply(陣列到列表)從plyr在每個組合上運行tmpmatf

library(plyr) 
alply(expand.grid(seq(length(submatrices[[1]])), 
        seq(length(submatrices[[2]]))), 
     1, 
     function(x) { 
      tmpmatf(submatrices[[1]][[x[[1]]]],submatrices[[2]][[x[[2]]]]) 
     }) 

這應該適用於您的兩個子表中的任意數量的子表,但是如果您真的有更多(> 2)子表的列表,那麼您沒有給我們足夠的信息來指定(例如)第三個子矩陣列表應粘貼到較大的矩陣中...

請注意,第一部分(通過兩列矩陣使用矩陣索引)比使用for循環將單個元素插入矩陣,但第二部分(alply)實際上並不比任何組合的嵌套for循環更快(在任何情況下) - 在這種情況下後者可能更清晰/更易於調試...

+0

感謝您的意見。我將在我的問題中澄清:小矩陣將被插入矩陣M中具有相同行和列名稱的位置。 – SAT