【问题标题】:Subtracting a vector from each element in a "matrix of vectors along 3rd dimension"从“沿第三维的向量矩阵”中的每个元素中减去一个向量
【发布时间】:2016-04-28 20:13:44
【问题描述】:

作为一个类比,考虑图像中像素的颜色。假设我们有一个 3D 数组,表示沿维度 3 堆叠的矩阵中图像的红色、绿色和蓝色通道。从整个图像中“减去颜色”(由长度为 3 的向量表示)的最简单方法是什么,在从红色通道中减去颜色的红色分量、从绿色通道中减去绿色分量、从蓝色通道中减去蓝色分量的感觉?

给定图像 A 和颜色 v,我们可以这样做:

for(i : 1:3){
    A[,,i] <- A[,,i] - v[i]
}

A - array(rep(v,each=length(A[,,1])),dim(A))

最好的方法是什么?如果有像rowcol 这样的函数,但对于第三维(比如level),那么我可以简单地做

A - v[level(A)]

有这样的功能吗?

【问题讨论】:

  • ?slice.index; A - v[slice.index(A, 3)]
  • @alexis_laz 完美。你能把它变成答案吗?

标签: r


【解决方案1】:

dim() &gt; 2 的等价物或 row/col?slice.index

#with lmo's example
temp - (1:3)[slice.index(temp, 3)]

row/col 一样,它创建一个等于“dim”的整数数组作为输入,这比for 循环的内存效率更低。

还有一个记录基准:

f1 = function(x, v)
{
    for(k in seq_len(dim(x)[3])) x[, , k] = x[, , k] - v[[k]]
    return(x)
}

f2 = function(x, v) sweep(x, 3, v)

f3 = function(x, v) x - v[slice.index(x, 3)]

set.seed(911); ARR = array(runif(11), c(300, 300, 300)); V = sample(300)

system.time({ ans1 = f1(ARR, V) })
#   user  system elapsed 
#   0.91    0.19    1.09 
system.time({ ans2 = f2(ARR, V) })
#   user  system elapsed 
#   1.20    0.06    1.26 
system.time({ ans3 = f3(ARR, V) })
#   user  system elapsed 
#   0.47    0.14    0.61 

identical(ans1, ans2)
#[1] TRUE
identical(ans2, ans3)
#[1] TRUE

【讨论】:

    【解决方案2】:

    看看sweep。它会做你想做的事以及更多:

    temp <- array(rep(c(1:3), each=25), dim=c(5, 5, 3))
    # subtract 1 from matrix [,,1], 2 from matrix [,,2], 3 from matrix [,,3]
    sweep(temp, 3, 1:3)
    

    【讨论】:

      猜你喜欢
      • 2014-01-02
      • 2022-01-06
      • 1970-01-01
      • 2015-05-15
      • 1970-01-01
      • 2021-08-13
      • 2014-08-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多