广播类似于 Numpy 的犰狳矩阵运算的最佳方式
Best way to broadcast Armadillo matrix operations similar to Numpy
考虑矩阵 A 和 B,其中 A 是 5x5
矩阵,B 是 1x5
矩阵(或行向量)。如果我尝试在 Numpy 中执行 A + B
,它的广播功能将隐式创建一个 5x5
矩阵,其中每一行都有 B 的值,然后在这两个矩阵之间进行正常的矩阵加法。这可以用犰狳这样写;
mat A = randu<mat>(4,5);
mat B = randu<mat>(1,5);
A + B;
但这失败了。而且我查看了文档,但找不到进行广播的内置方式。所以我想知道最好(最快)的方法来做一个类似于上面的操作。
当然,我可以手动将较小矩阵的大小调整为较大矩阵的大小,并使用 for 循环将第一行值复制到每一行,并在 Armadillo 中使用重载的 +
运算符。但是,我希望有一种更有效的方法来实现这一目标。任何帮助将不胜感激!
扩展 Claes Rolen 的笔记。 Armadillo 中的矩阵广播是使用 .each_col() and .each_row(). Broadcasting for cubes is done with .each_slice().
完成的
mat A(4, 5, fill::randu);
colvec V(4, fill::randu);
rowvec R(5, fill::randu);
mat X = A.each_col() + V; // or A.each_col() += V for in-place operation
mat Y = A.each_row() + R; // or A.each_row() += R for in-place operation
cube C(4, 5, 2, fill::randu);
cube D = C.each_slice() + A; // or C.each_slice() += A for in-place operation
考虑矩阵 A 和 B,其中 A 是 5x5
矩阵,B 是 1x5
矩阵(或行向量)。如果我尝试在 Numpy 中执行 A + B
,它的广播功能将隐式创建一个 5x5
矩阵,其中每一行都有 B 的值,然后在这两个矩阵之间进行正常的矩阵加法。这可以用犰狳这样写;
mat A = randu<mat>(4,5);
mat B = randu<mat>(1,5);
A + B;
但这失败了。而且我查看了文档,但找不到进行广播的内置方式。所以我想知道最好(最快)的方法来做一个类似于上面的操作。
当然,我可以手动将较小矩阵的大小调整为较大矩阵的大小,并使用 for 循环将第一行值复制到每一行,并在 Armadillo 中使用重载的 +
运算符。但是,我希望有一种更有效的方法来实现这一目标。任何帮助将不胜感激!
扩展 Claes Rolen 的笔记。 Armadillo 中的矩阵广播是使用 .each_col() and .each_row(). Broadcasting for cubes is done with .each_slice().
完成的mat A(4, 5, fill::randu);
colvec V(4, fill::randu);
rowvec R(5, fill::randu);
mat X = A.each_col() + V; // or A.each_col() += V for in-place operation
mat Y = A.each_row() + R; // or A.each_row() += R for in-place operation
cube C(4, 5, 2, fill::randu);
cube D = C.each_slice() + A; // or C.each_slice() += A for in-place operation