在犰狳中对立方体切片进行操作

Posted

技术标签:

【中文标题】在犰狳中对立方体切片进行操作【英文标题】:Operating on slices of Cube in armadillo 【发布时间】:2017-07-29 04:58:34 【问题描述】:

我正在尝试习惯 c++ 的犰狳线性代数库,但我无法弄清楚对立方体的切片(矩阵)进行操作的热度。每当我尝试对切片进行操作时,程序都会编译但不提供任何输出,甚至不提供切片操作之前的语句输出。 代码如下:

#include <armadillo>
#include <iostream>
using namespace arma;
using namespace std;

int main()


Cube<double> A(3  , 5 ,1, fill::randu);

Cube<double>B(5,3,1,fill::randu);
Mat<double>x  =A.slice(0);
Mat<double>y = B.slice(0);
cout << x << "\n" << y << endl;
cout << x*y << endl; //code works fine if this line is removed

问题是如果最后一行被删除,代码可以正常工作。为什么会这样?有没有更好的方法来操作立方体内的矩阵?

【问题讨论】:

我无法重现您的问题,代码对我来说很好。也许与犰狳或编译器版本有关?我使用犰狳 7.300 和 gcc 6.2.1。 @Hannebambel 我在 Windows 10 上使用 armadillo 7.950.1 和 gcc 7.1.0 @Hannebambel 你在使用 Windows 吗?我认为这可能是问题,因为犰狳库是使用 MSVC 2012 构建的 我正在使用 linux,刚刚使用 Armadillo 7.900 和 gcc 7.1.1 以及 clang 4.0.0 验证了您的程序。所以我想你是对的,Windows 就是这里的问题。也许您可以使用 gcc 自己编译犰狳? @Hannebambel 好吧,我已经习惯了标准库,这是我第一次使用一些外部数学库。所以,我不知道如何使用 gcc 构建犰狳。你能提供一些步骤或链接到某个网站吗? 【参考方案1】:

使用已接受的this 问题答案中给出的说明,使用 Visual Studio 在 Windows 上安装 Armadillo。

如果您要求链接器使用blas_win64_MT.liblapack_win64_MT.lib 库,请确保将各自的.dll 添加到与.exe 文件相同的目录中。然后使用这段代码,我得到了想要的输出。

#include <armadillo>
#include <iostream>

using namespace std;
using namespace arma;

int main()

    Cube<double> A(3, 5, 1, fill::randu);
    Cube<double> B(5, 3, 1, fill::randu);

    Mat<double> x = A.slice(0);
    Mat<double> y = B.slice(0);

    std::cout << "x:\n" << x << "\ny:\n" << y << std::endl;
    std::cout << "x*y:\n" << x*y << std::endl;

命令窗口中的输出:

希望有帮助!

【讨论】:

我正在使用 gcc 编译器。不能用windows造犰狳吗? 不幸的是,我在 Linux 机器上使用 gcc,在 Windows 机器上使用 VS。如果您在 Windows 中使用 Cygwin 以使用 gcc 进行编译,则使用 gcc 进行编译的说明也应该在 Windows 中有效。 documentation 说:“BLAS 用于矩阵乘法。没有 BLAS,犰狳将使用内置的矩阵乘法例程......”。你在使用 OpenBLAS 吗? 没有。我现在已经切换到 ubuntu 了。一切正常。

以上是关于在犰狳中对立方体切片进行操作的主要内容,如果未能解决你的问题,请参考以下文章

犰狳:将立方体子视图(管)转换为矢量

如何将犰狳矩阵转换为立方体?

犰狳错误的字段索引

使用 RcppArmadillo 时无法加载犰狳立方体<uword>

使用犰狳做 `Q.slice(a).col(b)` 的更有效方法

数据立方体的高斯卷积