在犰狳中对立方体切片进行操作
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.lib
和lapack_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>