armadillo c++:将矩阵的每一行乘以向量的有效而简洁的方法?
Posted
技术标签:
【中文标题】armadillo c++:将矩阵的每一行乘以向量的有效而简洁的方法?【英文标题】:armadillo c++: Efficient and concise way to multiply every row of a matrix by a vector? 【发布时间】:2014-02-19 18:45:58 【问题描述】:我想知道是否有一种有效且简洁的方法来将 Armadillo C++ 矩阵的每一行(或每一列)乘以一个向量。行(或列)和向量的大小相同。
例如,如果 fmat::each_row()(和/或 each_col())可以用作右值,我希望这样的东西能够编译(目前它不会编译):
#include <armadillo>
int main()
using namespace arma;
fmat m(20, 10);
fvec v(10); // a column vector
m.each_row() % v.t(); // Currently a compiler error.
return 0;
【问题讨论】:
【参考方案1】:从 Armadillo 5.6 版开始,.each_col()
和 .each_row()
方法已扩展为处理异地操作。因此你建议的方法
m.each_row() % v.t();
应该编译,见http://arma.sourceforge.net/docs.html#each_colrow。
【讨论】:
【参考方案2】:您似乎使用了错误的运算符。根据.each_row() and .each_col() 的文档,您需要指定一个in-place 操作(例如+=、-=、/=、%=)。换句话说,使用 %= 代替 %,如下所示:
m.each_row() % v.t(); // wrong
m.each_row() %= v.t(); // right
除了就地操作之外,.each_row() 和 .each_col() 唯一允许的其他操作是“=”本身。
【讨论】:
感谢您的回复。是的,我知道这一点。我正在/正在寻找一个非就地“each_row”。这就是为什么我说“如果...可以用作右值”。我想这个问题需要改写。我正在寻找的是类似于 Blitz++ 的张量索引对象。 所以你想要像fmat x = m.each_row() % v.t()
这样的东西?一个简单的解决方法可以是fmat x = m; x.each_row() %= v.t()
。这是否足以满足您的要求?您始终可以将 .each_row() 扩展为更通用,并将补丁发送到上游。
基本上,这就是我现在所做的。我正在寻找 each_row/each_col 的右值版本来实现最佳表达式,例如: (m1.each_row() % rv1 + m2.each_row() % rv2).each_col() % cv1。目前,我使用 each_row/col 创建临时对象,将行向量 rv1 和 rv2 扩展为具有 m1 和 m2 (MxN) 暗淡的矩阵。这些用法如下:(m1 % temp_rv1 + m2 % temp_rv2)% temp_cv1。但是对于大矩阵(10K^2),这会变得很昂贵。我看到大约 3 GB 的内存峰值,我想显着减少它。 each_row/col 的右值版本会有所帮助。也许我应该阅读犰狳的代码。以上是关于armadillo c++:将矩阵的每一行乘以向量的有效而简洁的方法?的主要内容,如果未能解决你的问题,请参考以下文章