【问题标题】: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 构建犰狳。你能提供一些步骤或链接到某个网站吗?

标签: c++ c++11 linear-algebra armadillo


【解决方案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 了。一切正常。
猜你喜欢
  • 2014-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多