1

だからここにスキニーがあります:

  1. ルービック キューブを想像してみてください。それは3x3x3です。私はたまたま、ルービックの「キューブ」である配列を持っていますが、それは 4x4xn だけです。n は 1 から始まる

  2. 配列内の各 4x4 行列の特定の条件が真の場合、行列はそれ自体を複製します。つまり、n は 1 ずつ大きくなります (配列、またはルービック キューブが長くなる/直方体になります)。たとえば、配列内の各 4x4 行列について、[2,4] > [2,1] の場合、行列は配列内でそれ自体の別のバージョンを複製します。

  3. 配列内の各 4x4 行列の同じ特定の条件が false の場合、行列自体が「死ぬ」か、存在しなくなります。配列、またはルービック キューブが短くなります。たとえば、配列内の各 4x4 行列について、[2,4] < [2,1] の場合、行列は配列から消去されます。

  4. だから私はこれを配列に構築しようとしましたが、明らかに、配列から行列を自由に追加および削除することはできません。

  5. テンソルを構築する必要があると言われました-(私の概念モデルからウィキペディアの言うことまで、これは2次応力テンソルのようです)。私は物理学者ではありませんし、数学の純粋主義者でもありません。私は基本的な応用数学の専門家 (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
        }
    }
}

これはうまくいきません。

4

1 に答える 1

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)
于 2012-05-23T04:24:31.887 に答える