两个 Eigen::VectorXd 的高效(非标准)连接
Efficient (non-standard) join of two Eigen::VectorXd
我有两个 Eigen::VectorXd 对象,A 和 B,具有相同的维度 n。
我想创建一个新的向量 C,这样:
- 如果B[i]是NaN,C[i] = A[i]
- 否则:C[i] = B[i]
由于应用程序对延迟敏感,我想避免制作 A 和 B 的副本。
现在我正在使用一个简单的 for 循环,但我想获得有关如何使用 Eigen 以智能(呃)方式实现它的建议。
尝试使用 select
:
C = (B.array() == B.array()).select(B, A);
B==B
在非 NaN
的值中为真,否则为假。
对于真值,select returns 第一个矩阵,对于假值第二个。
如前所述,更简洁的写法是:
C = B.array().isNaN().select(A, B);
在性能方面,这不是矢量化的(至少我上次检查过),但不会引入 A
和 B
的副本。它可能和你写的一样(据我所知,没有看到代码)。
我有两个 Eigen::VectorXd 对象,A 和 B,具有相同的维度 n。
我想创建一个新的向量 C,这样:
- 如果B[i]是NaN,C[i] = A[i]
- 否则:C[i] = B[i]
由于应用程序对延迟敏感,我想避免制作 A 和 B 的副本。
现在我正在使用一个简单的 for 循环,但我想获得有关如何使用 Eigen 以智能(呃)方式实现它的建议。
尝试使用 select
:
C = (B.array() == B.array()).select(B, A);
B==B
在非 NaN
的值中为真,否则为假。
对于真值,select returns 第一个矩阵,对于假值第二个。
如前所述
C = B.array().isNaN().select(A, B);
在性能方面,这不是矢量化的(至少我上次检查过),但不会引入 A
和 B
的副本。它可能和你写的一样(据我所知,没有看到代码)。