从第三维"

时间:2016-04-28 20:13:44

标签: r

作为类比,考虑图像中像素的颜色。假设我们有一个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)]

有这样的功能吗?

2 个答案:

答案 0 :(得分:1)

row/col的等效或dim() > 2?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

答案 1 :(得分:0)

看看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)