广播类似于 Numpy 的犰狳矩阵运算的最佳方式

Posted

技术标签:

【中文标题】广播类似于 Numpy 的犰狳矩阵运算的最佳方式【英文标题】:Best way to broadcast Armadillo matrix operations similar to Numpy 【发布时间】:2020-10-03 16:11:35 【问题描述】:

考虑矩阵 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 中的重载 + 运算符。但是,我希望有一种更有效的方法来实现这一点。任何帮助将不胜感激!

【问题讨论】:

查看 .each_row() 函数。例如。 A.each_row() += B 非常感谢!我想我一定是错过了这部分文档,但是知道这对未来很有帮助 【参考方案1】:

扩展 Claes Rolen 的笔记。 Armadillo 中的矩阵广播是使用.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, 5, 2, fill::randu);
cube D = C.each_slice() + A;  // or C.each_slice() += A for in-place operation

【讨论】:

谢谢!知道这一点会让我的任务更轻松。

以上是关于广播类似于 Numpy 的犰狳矩阵运算的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章

min 与 + 运算转换成类似于矩阵乘法的推导过程

NumPy之:理解广播

犰狳中是不是有类似稀疏立方体的东西,或者使用稀疏矩阵作为立方体中的切片的某种方式?

Numpy 高级

使用 carma(犰狳矩阵和 numpy 数组)用 pybind11 包装 c++ 类时出错

python 的矩阵运算——numpy