广播类似于 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 的犰狳矩阵运算的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章
犰狳中是不是有类似稀疏立方体的东西,或者使用稀疏矩阵作为立方体中的切片的某种方式?