2012-05-23 60 views
1

所以這裏的瘦:建設,而不是一個變量大小的數組張量

  1. 試想一個魔方;它是3x3x3。我碰巧有一個數組,它是一個rubik的「立方體」,只有它是4x4xn。用正出發爲1

  2. 當在陣列中的每個4×4矩陣一定條件爲真,則矩陣複製自身;這是正增長1(陣列,或魔方變長/變爲長方體)。比方說,對於陣列中的每個4×4矩陣中,如果[2,4]> [2,1],則矩陣複製陣列內的本身另一個版本。

  3. 當在陣列中的每個4×4矩陣,它同某些條件爲假,則該基體本身「管芯」或擦除了自身的存在。陣列或魔方變短了。比方說,對於陣列中的每個4×4矩陣中,如果[2,4] < [2,1],那麼擦除基質本身出來的陣列構成。

  4. 所以我試圖建立到一個數組這一點,顯然你不能只從一個數組隨意添加和刪除矩陣。

  5. 我被告知你必須建立張量 - (從我的概念模型到維基百科所說的,它看起來像是二階應力張量)。我不是物理學家,絕對不是數學純粹主義者。我是一名基礎應用數學家(ORSA),但我沒有任何學位,只有幾年的經驗做「分析」。

  6. 是否有人可以請我證明我如何在R中構建這個結構。我希望你明白,找到關於如何在R類型中構建張量的可理解/概念信息我相信我是寫作是非常困難的。

謝謝你這麼多的任何幫助您可以提供。

我非常感謝。

所以這裏有一些什麼我已經試過:

cells<-c(0,.4,0,0,.25,.6,.25,.5,4,12,4,10,20,0,0,0) 
Mu<-matrix(cells, 4,4, byrow=TRUE) 
Ma<-list(Mu) 
for(i in Ma){ 
    if(i[2,4] > i[2,1]){ 
     j <-length(Ma) + 1 
     c[Ma, j<-Mu] 
    }else if(i[2,4] < i[2,1]){ 
     Ma[[i]] <- NULL 
     } 
    } 
} 

這不起作用(我吸)。

+0

此外,作爲後續問題,是在某個位置找到矩陣中的最大值的方式[我,j]與張量相同的陣列?當我試圖用數組來做這件事時,我這樣做了: 'BEST < - the_array [1,1:3,which.max(the_array [1,4,])]]。張量結構會有什麼不同嗎?' –

+0

由於您希望4 * 4矩陣的集合能夠增長和縮小,爲什麼不使用4 * 4矩陣的列表(或環境)呢? –

+0

當我試圖建立一個列表時,我發現基於列表元素內元素的條件來自我複製非常困難。因此,讓我們說有一個矩陣作爲列表中的一個元素,我想比較該矩陣內的一個元素與該矩陣內的另一個元素,以查看是要刪除還是複製該矩陣,這是非常困難的(我不是說這是不可能的;我說我在太陽下嘗試了很多方法來做到這一點,而R +我對它的有限知識+我的大猩猩邏輯=錯誤) –

回答

4

由於您需要能夠從您的陣列中添加或刪除4 * 4矩陣,因此可能更容易使用4 * 4矩陣的列表,而不是數組。

# Initial data 
d <- replicate(3, matrix(sample(1:16),4,4), simplify=FALSE) 
# Remove an element 
remove <- function(d, i) { 
    d[[i]] <- NULL 
    d 
} 
# Duplicate an element 
duplicate <- function(d, i) { 
    d <- append(d, list(d[[i]])) 
    d 
} 
# Example 
d <- remove(d, 1) 
d <- duplicate(d, 2) 
d <- remove(d, 1) 
d 

如果性能是一個問題(列表被再次複製,再), 你可能更願意使用的環境來代替。

# Sample data 
d <- replicate(3, matrix(sample(1:16),4,4), simplify=FALSE) 
names(d) <- as.character(seq_along(d)) 
e <- as.environment(d) 
# Remove an element 
remove <- function(e, i) { 
    rm(list=as.character(i), envir=e) 
    e 
} 
# Duplicate an element 
duplicate <- function(e, i) { 
    stopifnot(length(ls(e)) > 0) 
    j <- max(as.numeric(ls(e))) + 1 
    assign(as.character(j), get(as.character(i), envir=e), envir=e) 
    e 
} 
# Example (the elements are named, and their names do not change) 
remove(e, 1) 
duplicate(e, 3) 
remove(e, 2) 
as.list(e) 

隨着你的條件進行復制和刪除,這成爲:

# Sample data 
d <- replicate(3, matrix(sample(1:16),4,4), simplify=FALSE) 
names(d) <- as.character(seq_along(d)) 
e <- as.environment(d) 
# Main loop 
for(i in ls(e)) {  # i is the name of the matrix 
    m <- get(i, envir=e) # The matrix itself 
    if(m[2,4] > m[2,1]) { 
    cat("Duplicating", i, "\n") 
    duplicate(e, i) 
    } else { 
    cat("Removing", i, "\n") 
    remove(e, i) 
    } 
} 
as.list(e) 
+0

Vincent,這真的很有幫助。這將有助於我確定地朝着正確的方向前進。謝謝。對此,我真的非常感激。 –

+0

我也非常感謝你考慮了兩種可能的情況,那就是超越和超越。再次感謝你! –

相關問題