这是我在第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))
将结果打印到控制台,但在输出标志错误中添加任意数字。
答案 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
试图绕过元编程失败可能是错误的。)