【问题标题】:Building a Tensor instead of a Variable Sized Array构建张量而不是可变大小的数组
【发布时间】:2019-02-05 11:01:47
【问题描述】:

所以这里是瘦的:

  1. 想象一个魔方;它是 3x3x3。我碰巧有一个数组,它是一个魔方的“立方体”,只是它是 4x4xn。 n 从 1 开始

  2. 当数组中每个 4x4 矩阵中的某个条件为真时,矩阵会自我复制;即 n 增长 1(数组或魔方变长/变成长方体)。假设,对于数组中的每个 4x4 矩阵,如果 [2,4] > [2,1],则矩阵在数组中复制其自身的另一个版本。

  3. 当数组中每个 4x4 矩阵中的相同特定条件为假时,矩阵本身会“死亡”或将其自身从存在中抹去。数组或魔方变得更短。比方说,对于数组中的每个 4x4 矩阵,如果 [2,4]

  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
        }
    }
}

这不起作用。

【问题讨论】:

  • 另外,作为后续问题,在数组中某个位置[i,j]的矩阵中查找最大值的方法与使用张量相同吗?当我尝试对数组执行此操作时,我这样做了:'BEST
  • 既然您希望 4*4 矩阵的集合能够增长和缩小,为什么不使用 4*4 矩阵的列表(或环境)?
  • 当我尝试构建一个列表时,我发现很难根据列表元素中的元素条件进行自我复制。所以让我们说有一个矩阵作为列表中的一个元素,我想将该矩阵中的一个元素与该矩阵中的另一个元素进行比较,看看我是否要删除或复制该矩阵,这很难做到(我并不是说这是不可能的;我是说我已经在阳光下尝试了尽可能多的方法来做到这一点,而 R + 我对它的有限了解 + 我的大猩猩逻辑 = 错误)
  • Vincent,您是否碰巧认识另一个可能会问如何在 stackoverflow 上执行此操作的人 - 创建一个环境/矩阵列表,然后可以从中访问元素以查看条件是否为真?非常感谢您的帮助。我将尝试在 R 中构建此列表并向您展示我是如何做到的。只是我的任何方法都远未接近实现我想要做的事情。
  • 如果您提供reproducible 示例,人们会更容易回答。

标签: arrays r matrix rubiks-cube


【解决方案1】:

由于您需要能够从数组中添加或删除 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)

【讨论】:

  • 文森特,这真的很有帮助。这肯定会帮助我朝着正确的方向前进。谢谢你。我真的很感激。
  • 我也非常感谢您考虑了两种可能的情况,而这只是超越。再次感谢您!
猜你喜欢
  • 2019-12-13
  • 1970-01-01
  • 1970-01-01
  • 2013-04-09
  • 2019-06-28
  • 1970-01-01
  • 1970-01-01
  • 2020-01-03
  • 2016-10-30
相关资源
最近更新 更多