广播类似于Numpy的Armadillo矩阵运算的最佳方法

问题描述

考虑矩阵A和B,其中A是5x5矩阵,B是1x5矩阵(或行向量)。如果我尝试在Numpy中执行A + B,则其广播功能将隐式创建一个5x5矩阵,其中每行具有B的值,然后在这两个矩阵之间进行常规矩阵加法。可以这样用Armadillo编写;

mat A = randu<mat>(4,5);
mat B = randu<mat>(1,5);
A + B;

但这失败了。而且我查看了文档,找不到内置的广播方式。因此,我想知道进行上述操作的最佳(最快)方法

当然,我可以手动将较小的矩阵调整为较大的矩阵,并使用for循环将第一行值复制到其他行,并在Armadillo中使用重载的+运算符。但是,我希望有一种更有效的方法来实现这一目标。任何帮助将不胜感激!

解决方法

扩展Claes Rolen的注释。犰狳中的矩阵广播是使用.each_col().each_row()完成的。 cubes的广播是通过.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,2,fill::randu);
cube D = C.each_slice() + A;  // or C.each_slice() += A for in-place operation