按角度投影 - 结果具有随机顺序

时间:2012-12-09 15:01:44

标签: r for-loop mask

我一直在研究一些代码来对我一直在使用的天体物理学模型(sph specfically)进行数据分析。我目前遇到的问题是,下面的代码输出的图表(其中十个)虽然看起来是正确的,但是顺序不正确,即。自称为30度的图形看起来像50度应该输出,80应该是40,依此类推,没有明显的模式。可以提供任何帮助来解决这个问题。非常感谢。

#Set inclincations of observation
id <- c(0, 10, 20, 30, 40, 50, 60, 70, 80, 90)
i <- (id * pi) / 180

#Determine sign of velocity vector in direction of observer, then magnitude of said vector (using mask)
for (i in 1:length(i)) {
GD$vecdir <- (GD$Xvel * sin(i) + GD$Zvel * cos(i))
mask <- (GD$vecdir >= 0)
if (sum(mask) > 0) { 
  GD$vecmag[mask] <- sqrt((GD$Xvel^2 * sin(i)^2 ) + (GD$Zvel^2 * cos(i)^2))
}
if (sum(mask) < length(mask)) { 
  GD$vecmag[!mask] <- -(sqrt((GD$Xvel^2 * sin(i)^2 ) + (GD$Zvel^2 * cos(i)^2)))
}  
h2 <- hist(GD$vecmag, breaks=720,  plot=FALSE)
jpeg(paste("VMLOS", (i-1)*10, ".jpeg", sep = ""), width = 1280, height = 720)
print(plot(h2$mids, h2$counts, type="p", pch=4, lty=3, xlab="Velocity Vector Magnitude", ylab="counts", main=paste("VMLOS", (i-1)*10, sep="")))
print(lines(lowess(h2$mids, h2$counts, f=0.05), lwd=4, col="red"))
dev.off()
}

对于上下文,i是xz平面中的倾角,从弧度开始观察原点上的对象,从代码中显示的度数转换,然后vecdir部分计算出矢量幅度是否为设置或远离原点的粒子应该是参考观察者的正或负,然后掩模部分计算这样的大小。此外,代码的掩码部分返回警告:

1: In GD$vecmag[mask] <- sqrt((GD$Xvel^2 * sin(i)^2) + (GD$Zvel^2 *  ... :
  number of items to replace is not a multiple of replacement length
2: In GD$vecmag[!mask] <- -(sqrt((GD$Xvel^2 * sin(i)^2) +  ... :
  number of items to replace is not a multiple of replacement length

每次使用(所以20个警告),这似乎不会对代码的输出产生负面影响,但是令人恼火,到目前为止我无法修复它。

将非常感激地收到任何帮助。

1 个答案:

答案 0 :(得分:2)

对于警告,您可能想要这个(请注意右侧表达式的索引):

GD$vecmag[mask] <- sqrt((GD$Xvel^2 * sin(i)^2 ) + (GD$Zvel^2 * cos(i)^2))[mask]

# ...

GD$vecmag[!mask] <- -(sqrt((GD$Xvel^2 * sin(i)^2 ) + (GD$Zvel^2 * cos(i)^2)))[!mask]

这会改变结果。

此外,您没有迭代正确的值。 1:长度(i)不是i中的值。 改变这个:

i <- (id * pi) / 180

#Determine sign of velocity vector in direction of observer, then magnitude of said vector (using mask)
for (i in 1:length(i)) {

到此:

angles <- (id * pi) / 180

#Determine sign of velocity vector in direction of observer, then magnitude of said vector (using mask)
for (i in angles) {

原始代码使用sin(1),sin(2),...,而不是向量中的值。这也将改变结果(并且可能不会明显使用错误的角度)。