作为类比,考虑图像中像素的颜色。假设我们有一个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))
最好的方法是什么?如果有row
和col
这样的函数,但是对于第三维(比如说level
)那么我可以简单地执行
A - v[level(A)]
有这样的功能吗?
答案 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)