【发布时间】:2013-08-16 20:51:32
【问题描述】:
我正在尝试优化我编写的一些代码,因为它对于大型数据集来说非常慢。我不确定是否可以通过矩阵运算完成以下操作,如果有人有任何建议可以使其更快,我将不胜感激。
我有一个包含零和整数的矩阵,我想将各个列的条目下移条目中整数的绝对数。
[,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
每列的规则如下:
- 从顶部开始查找与以下不同的第一个条目 零
- 按该条目的绝对数字向下移动
- 如果目标点有另一个条目,则置零
- 重复下一列
谢谢,
尼科斯
【问题讨论】:
-
我不明白第 3 步(如果在目标点有另一个条目,则置零)...
-
对于第 3 步:A[3,1] 和 A[4,1] 它们都指向 A[7,1],当这种情况发生时取消两者。
-
假设您这样做。 下一步是什么?我只是想知道在给定输入数据的情况下是否有更简单/更好的方法来实现最终所需的输出?
-
“按该条目的绝对数字向下移动”.. 这是什么意思?