R 相当于在 Matlab 中置换数组维度 permute(A, dimorder)

Posted

技术标签:

【中文标题】R 相当于在 Matlab 中置换数组维度 permute(A, dimorder)【英文标题】:R equivalent to permuting array dimensions permute(A, dimorder) in Matlab 【发布时间】:2021-12-08 04:02:25 【问题描述】:

我正在从 Matlab 中寻找与 permute(A,dimorder) 等效的东西,以便将一些 Matlab 代码转换为 R。 一个循环需要一条看起来像这样的行:

x = permute(ai(b(i,ii),:,:,:,:,:),[2 3 4 5 6 1])

元胞数组结构,例如a1(1,:,:,:,:,:) 导致选择元胞数组a 中的第一行矩阵。 [2 3 4 5 6 1] 中的permute() 指的是dimorder。 可以在此处找到 matlab 函数 permute() 的文档,包括示例输出: https://de.mathworks.com/help/matlab/ref/permute.html

R 中有几个函数以某种方式指代排列,但它们似乎都不是我想要的,尽管我可能弄错了。

【问题讨论】:

对于基础 R,aperm:***.com/questions/10679131/… @jblood94 不幸的是,如果我使用aperm(a[[i]] [b[i,ii],], c(2,3,4,5,6,1)),我不会得到与 matlab 代码等效的结果。使用 abind 我不知道如何包含 [2 3 4 5 6 1] 部分。 有趣。据我所知,这些功能是等效的。你能举出一个可重现的例子吗? @jbloo94 我在我的问题中添加了一些 matlab 代码,以提供可重现的结果。这是我正在转换的一个Matlab脚本(剪掉了大部分的cmets,所以看起来可能有点乱,相关的行(循环)在下半部分)。 你能添加你的 R 尝试吗? 【参考方案1】:

我相信我成功地在 R 中复制了 MATLAB 脚本。我认为您实际上不需要 permute 的等价物。在 MATLAB 脚本中,permute 似乎只是删除了多余的维度。 R 默认情况下会这样做,除非您在子集数组时指定 drop = FALSE,例如,

lnA[[tau, modal]] <- a[[modal]][outcomes[modal, tau],,,drop = FALSE]

如果我在最终的 for 循环之前将 lnA = cell(T, NumModalities); 添加到 MATLAB 脚本,然后将循环内部修改为

lnAtau, modal = permute(amodal(outcomes(modal,tau),:,:,:,:,:),[2 3 4 5 6 1]);

然后,我在lnA 中得到相同的矩阵数组,用于 MATLAB 和 R 实现。

在 R 中,我使用列表数组作为 MATLAB 2+ 维元胞数组的等价物:

lnA1 = cell(T, 1); # MATLAB
lnA1 <- vector("list", Time) # R    
lnA2 = cell(T, NumModalities); # MATLAB
lnA2 <- array(vector("list", Time*NumModalities), c(Time, NumModalities)) # R
lnA2 <- matrix(vector("list", Time*NumModalities), Time) # R
lnA3 = cell(T, NumModalities, 2); # MATLAB
lnA3 <- array(vector("list", Time*NumModalities*2), c(Time, NumModalities, 2)) # R

下面是实现:

nat_log <- function (x)  # necessary as log(0) not defined...
  x <- log(x + exp(-16))


# Set up a list for D and A
D <- list(c(1, 0),       # (left better, right better)
          c(1, 0, 0, 0)) #(start, hint, choose-left, choose-right)
A <- c(rep(list(array(0, c(3, 2, 4))), 2), list(array(0, c(4, 2, 4))))

Ns <- lengths(D) # number of states in each state factor (2 and 4)
A[[1]][,,1:Ns[2]] <- matrix(c(1,1,  # No Hint
                              0,0,  # Machine-Left Hint
                              0,0), # Machine-Right Hint
                      ncol = 2, nrow = 3, byrow = TRUE)

pHA <- 1
A[[1]][,,2] <- matrix(c(0,       0,       # No Hint
                        pHA,     1 - pHA, # Machine-Left Hint
                        1 - pHA, pHA),    # Machine-Right Hint
                      nrow = 3, ncol = 2, byrow = TRUE)

A[[2]][,,1:2] <- matrix(c(1, 1,   # Null
                          0, 0,   # Loss
                          0, 0),  # Win
                        ncol = 2, nrow = 3, byrow = TRUE)

pWin <- 0.8
A[[2]][,,3] <- matrix(c(0,        0,         # Null        
                        1 - pWin, pWin,      # Loss
                        pWin,     1 - pWin), # Win
                      ncol = 2, nrow = 3, byrow = TRUE)

A[[2]][,,4] <- matrix(c(0,        0,        # Null        
                        pWin,     1 - pWin, # Loss
                        1 - pWin, pWin),    # Win
                      ncol = 2, nrow = 3, byrow = TRUE)

for (i in 1:Ns[2]) 
  A[[3]][i,,i] <- c(1,1)


# Set up a list of matrices:
a <- lapply(1:3, function(i) A[[i]]*200)
a[[1]][,,2] <- matrix(c(0,    0,     # No Hint
                        0.25, 0.25,  # Machine-Left Hint
                        0.25, 0.25), # Machine-Right Hint
                      nrow = 3, ncol = 2, byrow = TRUE)

outcomes <- matrix(c(1, 2, 1,
                     1, 1, 2,
                     1, 2, 4),
                   ncol = 3, nrow = 3, byrow = TRUE)

NumModalities <- length(a)       # number of outcome factors
Time <- 3L
lnA <- array(vector("list", Time*NumModalities), c(Time, NumModalities))

for (tau in 1:Time)
  for (modal in 1:NumModalities)
    lnA[[tau, modal]] <- a[[modal]][outcomes[modal, tau],,]
  

【讨论】:

谢谢!工作!我实现了这个循环来将我的“a”矩阵列表转换为数组列表:a1 &lt;- c(rep(list(array(0, c(3, 2, 4))), 2), list(array(0, c(4, 2, 4)))) for (i in 1:ncol(A)) for (ii in 1:nrow(A)) a1[[ii]][,,i] = a[[ii,i]] 将其称为 a1 以区分“a”...

以上是关于R 相当于在 Matlab 中置换数组维度 permute(A, dimorder)的主要内容,如果未能解决你的问题,请参考以下文章

matlab报错矩阵维度不一致如何解决?

Matlab的多维数组操作

嵌套循环:置换由向量表示的 n 维数组

确定存储指向不同维度的其他数组的指针的数组的类型

MATLAB从入门到精通系列之MATLAB维度获取size()函数详解

[置换 前缀和]牛牛的猜球游戏