使用Armadillo稀疏矩阵的max函数时出错

时间:2015-12-22 13:33:25

标签: c++ armadillo

这是我在第5行收到错误(类型不匹配)的代码。与max

#include <iostream>
#include <stdlib.h>
#include <math.h>
#include<armadillo>  

using namespace std;
using namespace arma;

int main(int argc, char** argv) {
    umat loc;
    loc<<0<<0<<3<<endr
       <<2<<4<<4<<endr;

    vec val={1,2,3};
    sp_mat m(loc,val);

    double t=arma::max(sum(square(m),1)) + 1.0;
    cout<<t<<endl; 
    return 0;
}

有人可以告诉我为什么会发生这种错误以及如何解决这个问题 注意:cout<<max(sum(square(m),1))将结果打印到控制台,但在输出标志错误中添加任意数字。

2 个答案:

答案 0 :(得分:2)

如果要将1x1矩阵转换为纯标量(如double),请使用as_scalar()函数。对于任何导致1x1矩阵的Armadillo表达式也是如此。

在Stackoverflow上发布问题之前,最好彻底阅读Armadillo documentation

修改您的示例:

umat loc = { { 0, 0, 3 },
             { 2, 4, 4 } };

vec val = {1, 2, 3};

sp_mat m(loc,val);

m.print("m:");

max(sum(square(m),1)).print("expression:");

double t = as_scalar( max(sum(square(m),1)) );

cout << t << endl; 

答案 1 :(得分:0)

您没有告诉我们(我在文档中找不到)arma::max(sum(square(m),1))确切返回的数据类型

您已经测试过无论它是什么隐式转换为double,无论它是什么都可以发送到stream,当它完成时它看起来像一个double

我的猜测是可以显式转换为double的东西,所以请尝试:

(double)arma::max(sum(square(m),1)) + 1.0

文档显示了用于初始化double的密集矩阵的返回值,因此这显然是一种可以显式转换为double的类型。我最初错过了你为我链接的内容,有效地说sum在稀疏矩阵上做了一些与密集时相同的东西。所以你几乎可以得出结论(而不仅仅是猜测)max(sum(m))应该是同一类型(明确可转换为double)。

如果这不起作用,我们真的需要错误信息的完整引用,而不仅仅是它似乎意味着什么的摘要。

现在我们有错误信息,我们可以看到这是Armadillo的模板元编程中的一个缺陷:

操作堆叠在模板元编程中,以避免创建多余的临时对象。然后元编程必须在使用结果时解决整个混乱。

如果这是元编程中的一个小缺陷,你可以只添加一个简单的临时修复它:

double t = arma::max(sum(square(m),1));
cout << t+1.0 endl;

但你可能已经尝试过了。所以你可能需要更多的临时工具,你可能需要给它们准确的正确类型(而不是使用auto)。我的第一个猜测是:

colvec v = sum(square(m),1);

然后看看哪些适用于arma::max(v)

(之前我对一个答案提出了否定评论,建议从每个步骤的auto临时值开始。这个答案已被删除。这并没有错。但我仍然说这是错误的开始在没有看到模板元编程失败的情况下,虽然我不确定,但是使用auto试图绕过元编程失败可能是错误的。)