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++:将矩阵的每一行乘以向量的有效而简洁的方法?的主要内容,如果未能解决你的问题,请参考以下文章

是否有将dask.array的每一行(或列)乘以向量元素的有效方法?

将矩阵的行乘以向量(低级优化)?

在 C++ 中使用二维向量乘以矩阵

稀疏 x 密集矩阵乘以 Armadillo 出乎意料地慢

此矩阵运算的正式名称(将矩阵列乘以列向量)?

armadillo C++:从数组初始化矩阵