我正在审查一些像这样的代码,其中A
是一个可移动的类型:
// Returns true exactly when ownership of a is taken
bool MaybeConsume(A&& a) {
if (some condition) {
Consume(std::move(a)); // ???
return true;
}
return false;
}
// ... elsewhere ...
A a;
if (!MaybeConsume(std::move(a))) {
a.DoSomething(); // !!!
}
Run Code Online (Sandbox Code Playgroud)
我们的静态分析工具抱怨a
在移动(at !!!
)后使用.IIUC std::move
只是一个static_cast
,并且在调用a
移动构造函数或赋值运算符(可能是在Consume
)之前,该对象实际上不会被删除.假设MaybeConsume
在评论中满足合同,
std::move
在???
无操作?(可能这个特殊的实例可以重构以避免微妙,但我仍然想要求我自己的理解).
我正在努力理解lmer的功能.我已经找到了很多关于如何使用命令的信息,但没有太多关于它实际做了什么(除了一些神秘的评论:http://www.bioconductor.org/help/course-materials/2008/PHSIntro/ lme4Intro-handout-6.pdf).我正在玩以下简单的例子:
library(data.table)
library(lme4)
options(digits=15)
n<-1000
m<-100
data<-data.table(id=sample(1:m,n,replace=T),key="id")
b<-rnorm(m)
data$y<-rand[data$id]+rnorm(n)*0.1
fitted<-lmer(b~(1|id),data=data,verbose=T)
fitted
Run Code Online (Sandbox Code Playgroud)
我理解lmer拟合形式为Y_ {ij} = beta + B_i + epsilon_ {ij}的模型,其中epsilon_ {ij}和B_i分别是具有方差sigma ^ 2和tau ^ 2的独立法线.如果theta = tau/sigma是固定的,我用正确的均值和最小方差计算β的估计值
c = sum_{i,j} alpha_i y_{ij}
Run Code Online (Sandbox Code Playgroud)
哪里
alpha_i = lambda/(1 + theta^2 n_i)
lambda = 1/[\sum_i n_i/(1+theta^2 n_i)]
n_i = number of observations from group i
Run Code Online (Sandbox Code Playgroud)
我还计算了sigma ^ 2的以下无偏估计:
s ^ 2 =\sum_ {i,j} alpha_i(y_ {ij} - c)^ 2 /(1 + theta ^ 2 - lambda)
这些估计似乎与lmer产生的一致.但是,我无法弄清楚在这种情况下如何定义对数似然.我计算了概率密度
pd(Y_{ij}=y_{ij}) = …
Run Code Online (Sandbox Code Playgroud)