我正在尝试优化我编写的一些代码,因为它对于大型数据集来说非常慢。我不确定是否可以通过矩阵运算完成以下操作,如果有人有任何建议可以使其更快,我将不胜感激。
我有一个带有零和整数的矩阵,我想将各个列的条目向下移动条目中整数的绝对数。
[,1] [,2] [,3]
[1,] 0 0 0
[2,] 0 -4 0
[3,] 4 0 0
[4,] -3 -2 0
[5,] 0 2 -1
[6,] 2 -2 0
[7,] 0 0 0
[8,] -3 -3 0
我正在使用的代码如下:
#data
A<-matrix(data=c(0,0,4,-3,0,2,0,-3,0,-4,0,-2,2,-2,0,-3,0,0,0,0,-1,0,0,0),nrow=8,ncol=3)
#shift function
shift<-function(x)
{
#create the output matrix
out<-matrix(data=0,nrow=8,ncol=1)
#for loop to create the shift matrix
for(i in seq(1,8,by=1))
{
if(i+abs(x[i])<=8)
{
#find the non zero
if(x[i]!=0)
{
#if there is already a number put zero
if(out[i+abs(x[i]),1]!=0)
{
out[i+abs(x[i]),1]=0
} else {
#shift
out[i+abs(x[i]),1]=x[i]
}
}
}
}
#return object
return(out)
}
#run the logic
shift_mat<-sapply(1:ncol(A),FUN=function(k) shift(A[,k]))
结果是:
[,1] [,2] [,3]
[1,] 0 0 0
[2,] 0 0 0
[3,] 0 0 0
[4,] 0 0 0
[5,] 0 0 0
[6,] 0 0 -1
[7,] 0 2 0
[8,] 2 -2 0
每一列的规则如下:
- 从顶部开始查找不为零的第一个条目
- 按该条目的绝对数字向下移动
- 如果在目标点有另一个条目,则置零
- 重复下一列
谢谢,
尼科斯