0

当我给论文评分时,我经常观察到这样的错误(有时肯定是自己做的):

% 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快速排序的插图)。

是否有任何编译器/解释器可以优化第二个代码片段之类的代码,以将所需空间减少到就地操作所需的空间?

4

1 回答 1

1

是的,有。在您讨论的领域中有一些不同的优化:

  • 许多 C++ 编译器会进行复制省略以避免创建新的临时对象,只是为了立即将其复制到现有对象上。

  • LuaJIT 和其他一些编译器所做的分配下沉可能与您的想法相似。

  • 聚合的标量替换也是同样的道理。

于 2013-12-05T22:21:54.703 回答