当我评论论文时,我会经常观察到这样的错误(并且有时会自己制作):
% any vectorized language, such as MATLAB/Octave/R that supports logical indexing
Y = rand(1,10); % random numbers drawn uniformly from the interval [0,1] in a 1x10 vector
Y(Y<=0.6) = 1;
Y(Y>0.6) = 0; % These two lines try to convert the distribution from uniform to Bernoulli
此代码生成一个零向量,而不是所需的随机二进制向量,其分布近似于伯努利随机变量。
从编程的角度来看,问题在于就地修改;编码员跳过一个心理步骤。 (还有其他方法可以解决这个问题,基于代码应该完成的数学,或者通过切换条件等,但这些都是特定于应用程序的。)单元测试会使错误裸露,但我已经无法说服任何学生尝试它们(具体而言,它不是编程课程)。首先分配输出向量并根据输入向量填充它的代码可以防止这种情况发生:
X = rand(1,10); % random numbers in a 1x10 vector
Y = zeros(size(X));
Y(X<=0.6) = 1;
Y(X>0.6) = 0;
然而,这可以保证占用两倍的空间,虽然我会说它更适合这里错误编码器的心理模型,并且通常比一个真正错综复杂的算法更容易弄清楚(根本不浪费任何空间)请参阅快速排序的CLRS插图。
是否有任何编译器/解释器可以像第二个代码段一样优化代码,以减少就地操作所需的空间?
答案 0 :(得分:1)
是的,有。您讨论的领域中有一些不同的优化:
许多C ++编译器会执行copy elision以避免创建新的临时对象,只是立即将其复制到现有对象上。
LuaJIT和其他一些编译器所做的allocation sinking可能与您的想法相似。