r - 用R中的值通过for循环填充3D矩阵

标签 r 3d for-loop matrix

我设置了一个大小为 365x7x4 的 3 维矩阵。

x <- array(rep(1, 365*5*4), dim=c(365, 5, 4))

现在我将使用 for 循环为每个元素填充一个值。 可以说每个元素的值应该是行、列和深度的总和。 我想这相对容易。

谢谢!最好的,F

最佳答案

使用一个更简单的例子,这样我们就可以看到正在做什么

arr <- array(seq_len(3*3*3), dim = rep(3,3,3))

下面的代码给出了请求的输出:

dims <- dim(arr)
ind <- expand.grid(lapply(dims, seq_len))
arr[] <- rowSums(ind)

以上给出

> arr
, , 1

     [,1] [,2] [,3]
[1,]    3    4    5
[2,]    4    5    6
[3,]    5    6    7

, , 2

     [,1] [,2] [,3]
[1,]    4    5    6
[2,]    5    6    7
[3,]    6    7    8

, , 3

     [,1] [,2] [,3]
[1,]    5    6    7
[2,]    6    7    8
[3,]    7    8    9

> arr[1,1,1]
[1] 3
> arr[1,2,3]
[1] 6
> arr[3,3,3]
[1] 9

更新:使用此处@TimP 的答案中的示例,我更新了答案以展示如何以更像 R 的方式完成它。

给定

arr <- array(seq_len(3*3*3), dim = rep(3,3,3))

arr 的元素替换为 i + j + k 除非 k > 2,在这种情况下 j*k-i 被改用。

dims <- dim(arr)
ind <- expand.grid(lapply(dims, seq_len))
## which k > 2
want <- ind[,3] > 2
arr[!want] <- rowSums(ind[!want, ])
arr[want] <- ind[want, 2] * ind[want, 3] - ind[want, 1]

虽然坚持使用循环等熟悉的习语很诱人,而且与流行的看法相反,循环在 R 中并非效率低下,但学习以向量化的方式思考会在你学习的过程中得到很多返回语言并开始将其应用于数据分析任务。

以下是 Fabian 示例的一些时间安排:

> x <- array(rep(1, 365*5*4), dim=c(365, 5, 4))
> system.time({
+ for (i in seq_len(dim(x)[1])) {
+     for (j in seq_len(dim(x)[2])) {
+         for (k in seq_len(dim(x)[3])) {
+             val = i+j+k
+             if (k > 2) {
+                 val = j*k-i
+             }
+             x[i,j,k] = val
+         }
+     }
+ }
+ })
   user  system elapsed 
  0.043   0.000   0.044 
> arr <- array(rep(1, 365*5*4), dim=c(365, 5, 4))
> system.time({
+ dims <- dim(arr)
+ ind <- expand.grid(lapply(dims, seq_len))
+ ## which k > 2
+ want <- ind[,3] > 2
+ arr[!want] <- rowSums(ind[!want, ])
+ arr[want] <- ind[want, 2] * ind[want, 3] - ind[want, 1]
+ })
   user  system elapsed 
  0.005   0.000   0.006

还有一个更大的问题(至少对我的可恶的笔记本电脑来说是这样!)

> x <- array(rep(1, 200*200*200), dim=c(200, 200, 200))
> system.time({
+ for (i in seq_len(dim(x)[1])) {
+     for (j in seq_len(dim(x)[2])) {
+         for (k in seq_len(dim(x)[3])) {
+             val = i+j+k
+             if (k > 2) {
+                 val = j*k-i
+             }
+             x[i,j,k] = val
+         }
+     }
+ }
+ })
   user  system elapsed 
 51.759   0.129  53.090
> arr <- array(rep(1, 200*200*200), dim=c(200, 200, 200))
> system.time({
+     dims <- dim(arr)
+     ind <- expand.grid(lapply(dims, seq_len))
+     ## which k > 2
+     want <- ind[,3] > 2
+     arr[!want] <- rowSums(ind[!want, ])
+     arr[want] <- ind[want, 2] * ind[want, 3] - ind[want, 1]
+ })
   user  system elapsed 
  2.282   1.036   3.397 

但即使按照今天的标准,这也可能很小。您可以看到,由于该方法所需的所有函数调用,循环开始变得越来越没有竞争力。

关于r - 用R中的值通过for循环填充3D矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10967596/

相关文章:

R包lda中折叠的吉布斯采样

java - LibGdx 3D 地形网格渲染在 OpenGL ES 1.0 但不是 2.0 中工作

javascript - 来自 json 导出网格的具有 png alpha 透明度的平面 Material 不起作用

python - 检查文件中一行中的变量是否完全相同-Tkinter

r - ggplot2:如何区分点击和画笔?

r - 具有可变列名的函数

python - 是否可以在 wxPython 应用程序中使用 Panda3D?

c# - 如何创建一个非重复随机数数组

windows - 如何使用 forfiles(或类似的)删除早于 n 天的文件,但总是留下最近的 n

function - 对 R 中的每一行执行 if 语句