有效地将 NxJ 矩阵转换为具有 J 个数的 N 长数组

Efficiently transforming NxJ matrix into an N-long array with J numbers

我正在使用 Stan 做一些贝叶斯分析,我正在努力使我的代码更有效率。

在我的 Stan 模型字符串中,我有一个 NxJ 矩阵变量。以这种方式声明以利用快速矩阵运算和赋值。

但是,在最后的建模步骤(分配分布)中,我需要将这个 NxJ 矩阵转换为一个 N 长的数组,该数组的每个元素都包含 J 个实数值。

换句话说,我想要以下转换:

matrix[N,J] x;
vector[J] y[N];

for (i in 1:N)
    for (j in 1:J)
        y[i][j] = x[i,j]

有没有办法在没有 for 循环的情况下以矢量化的方式做到这一点?

谢谢!!!

没有。 Stan 中的循环非常快。向量化速度的唯一原因是是否涉及导数。您可以将其缩短为

for (n in 1:N)
  y[n] = x[n]';

但它不会更有效率。

我应该通过说这里有一个低效率来证明这一点,那就是缺乏内存局部性。如果矩阵很大,按行遍历它们会很慢,因为它们在内部按列优先存储。