编辑:抱歉,当我与桌面布局作斗争时,我没有看到帖子被裁剪掉了。 总结一下这个问题,我想知道编写迭代计算的最佳(也是最有效)方法是什么?
在下面的例子中可能不够清楚的一般想法实际上非常简单。
我有一个表(M.Motion)的列表,其中填充了坐标(M)和向量。每个向量是Mn和Mn-1之间的距离。
我有一个表(SalOrigine),这是一张图片转换为一张表格,每张图片中的每个像素都有一对坐标(288 * 162)。每组(M)坐标是在3D空间中投影的一张图片的中心。
我的目标是使用运动矢量和每个的坐标,从(M.Motion)列表计算每张图片的每个像素的位置 >(M)。 第一张图片在空间中始终具有相同的起始位置,并且以下图片具有顺序方式。 为此,我想计算第一个(SalOrigine)表,然后从中启动一个迭代循环,以便生成具有新坐标的Sal(n)表。每个 Sal(n)使用前面的 Sal(n-1)坐标集和(M.Motion)中的数据
我无法在R中获得工作脚本!
编辑结束/
情况如下:
我有一个包含一行数百个数据帧的列表。 M(x,y,z)是点,dM(x,y,z)是从点(n)到点(n + 1)的矢量。基本上,每个点都是平面的中心,矢量是两个平面之间的距离。
>head(M.Motion)
$`1`
M.X M.Y ID t M.Z M.dX M.dY M.dZ M.Yfov
1 1 1 0.014 1 0 0 0 954.85
$`2`
M.X M.Y ID t M.Z M.dX M.dY M.dZ M.Yfov
2.5 2.5 2 0.016 2.5 1.5 1.5 1.5 954.88
etc.
我还有一个"空白"数据框我将用于启动循环。它是(x,y)上288x162像素平面中每个像素的中心列表。
>head(SalOrigine)
ID S.X S.Y S.Z
1 0.5 0 0.5
2 1.5 0 0.5
3 2.5 0 0.5
etc.
我想创建一个脚本,生成一个新的data.frame,并为M.Motion的每一帧提供一组新的坐标。 含义,从SalOrigine开始:
-S.X2 =(SX + M.Motion $ 1 $ MX + M.Motion $ 1 $ M.dX -144.5)#-144.5用于校正S.X2的位置,因为MX是图片的中心
-S.Y2 =(S.Y + M.Motion $ 1 $ M.Y + M.Motion $ 1 $ M.dY)
-S.Z2 =(S.Z + M.Motion $ 1 $ M.Z + M.Motion $ 1 $ M.dZ -81.5)#same as -144.5
然后我会
>head(Sal1) fake values
ID S.X S.Y S.Z M.dX M.dY M.dZ S.X2 S.Y2 S.Z2
1 0.5 0 0.5 2 3 5 485.5 85.5 45.5
2 1.5 0 0.5 2 3 5 486.5 86.5 46.5
3 2.5 0 0.5 2 3 5 487.5 87.5 47.5
etc.
从这里开始,想法是从Sal(n-1)的坐标计算每个Sal(n),并添加相关的点M(x,y,z)和向量dM(x,y,z)这样:
-Sal2 $ S.X2 =(Sal1 $ S.X2 + M.Motion $ 2 $ M.X + M.Motion $ 2 $ M.dX -144.5)
http://tof.canardpc.com/view/297db212-3bd5-457d-b949-5099a1027ad0.jpg
答案 0 :(得分:0)
我不完全确定我理解你要找的是什么,看起来你似乎没有关于如何接近任何特定部分的问题。 话虽如此,我还是抨击了我认为你在寻找的东西。
library(data.table)
for(l in M.Motion){ #making a dataframe out of the list
if(!exists('dfmotion')) dfmotion <- l
else dfmotion <- rbind(dfmotion, l)
}
#setting it data.table
dfmotion <- as.data.table(dfmotion)
SalOrigine <- as.data.table(SalOrigine)
#setting merge keys
setkey(dfmotion, ID)
setkey(SalOrigine, ID)
#combining sal & motion
combined <- SalOrigine[dfmotion]
#doing the requested row based operations
combined[, ':=' (S.X2 = (S.X + M.X + M.dX -144.5),
S.Y2 = (S.Y + M.Y + M.dY),
S.Z2 = (S.Z + M.Z + M.dZ -81.5))]
combined[, S.X2 := S.X2 + M.X + M.dX)] #-144.5 already in S.X2?
确保在重新运行此代码之前删除dfmotion,因为如果重新运行并且dfmotion已经存在,循环将中断(或者更糟糕的是不会中断)。