R 相当于在 Matlab 中置换数组维度 permute(A, dimorder)
R equivalent to permuting array dimensions permute(A, dimorder) in Matlab
我正在寻找来自 Matlab 的 permute(A,dimorder)
的等价物,以便将一些 Matlab 代码转换为 R。
一个循环需要一条看起来像这样的线:
x = permute(a{i}(b(i,ii),:,:,:,:,:),[2 3 4 5 6 1])
元胞数组结构,例如a{1}(1,:,:,:,:,:)
导致选择元胞数组 a{}
中的第一行矩阵。 permute()
中的[2 3 4 5 6 1]
指的是dimorder
。
可以在此处找到包含示例输出的 matlab 函数 permute()
的文档:
https://de.mathworks.com/help/matlab/ref/permute.html
R 中有几个函数以某种方式引用排列,但似乎没有一个是我要找的,尽管我可能弄错了。
我相信我成功地在 R 中复制了 MATLAB 脚本。我认为您实际上不需要 permute
的等价物。在 MATLAB 脚本中,permute
似乎只是删除了多余的维度。 R 会默认执行此操作,除非您在对数组进行子集化时指定 drop = FALSE
,例如
lnA[[tau, modal]] <- a[[modal]][outcomes[modal, tau],,,drop = FALSE]
如果我在最终 for
循环之前将 lnA = cell(T, NumModalities);
添加到 MATLAB 脚本,然后将循环内部修改为
lnA{tau, modal} = permute(a{modal}(outcomes(modal,tau),:,:,:,:,:),[2 3 4 5 6 1]);
然后我在 lnA
中为 MATLAB 和 R 实现得到相同的矩阵数组。
在 R 中,我使用一个列表数组作为 MATLAB 二维元胞数组的等价物:
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],,]
}
}
我正在寻找来自 Matlab 的 permute(A,dimorder)
的等价物,以便将一些 Matlab 代码转换为 R。
一个循环需要一条看起来像这样的线:
x = permute(a{i}(b(i,ii),:,:,:,:,:),[2 3 4 5 6 1])
元胞数组结构,例如a{1}(1,:,:,:,:,:)
导致选择元胞数组 a{}
中的第一行矩阵。 permute()
中的[2 3 4 5 6 1]
指的是dimorder
。
可以在此处找到包含示例输出的 matlab 函数 permute()
的文档:
https://de.mathworks.com/help/matlab/ref/permute.html
R 中有几个函数以某种方式引用排列,但似乎没有一个是我要找的,尽管我可能弄错了。
我相信我成功地在 R 中复制了 MATLAB 脚本。我认为您实际上不需要 permute
的等价物。在 MATLAB 脚本中,permute
似乎只是删除了多余的维度。 R 会默认执行此操作,除非您在对数组进行子集化时指定 drop = FALSE
,例如
lnA[[tau, modal]] <- a[[modal]][outcomes[modal, tau],,,drop = FALSE]
如果我在最终 for
循环之前将 lnA = cell(T, NumModalities);
添加到 MATLAB 脚本,然后将循环内部修改为
lnA{tau, modal} = permute(a{modal}(outcomes(modal,tau),:,:,:,:,:),[2 3 4 5 6 1]);
然后我在 lnA
中为 MATLAB 和 R 实现得到相同的矩阵数组。
在 R 中,我使用一个列表数组作为 MATLAB 二维元胞数组的等价物:
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],,]
}
}