有效地将 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]';
但它不会更有效率。
我应该通过说这里有一个低效率来证明这一点,那就是缺乏内存局部性。如果矩阵很大,按行遍历它们会很慢,因为它们在内部按列优先存储。
我正在使用 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]';
但它不会更有效率。
我应该通过说这里有一个低效率来证明这一点,那就是缺乏内存局部性。如果矩阵很大,按行遍历它们会很慢,因为它们在内部按列优先存储。