将 max 函数与犰狳稀疏矩阵一起使用时出错
Error in using max function with Armadillo sparse matrices
这是我在第 3 行遇到错误(类型不匹配)的代码。 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))
将结果打印到控制台,但将任何数字添加到输出标志错误。
您没有告诉我们(我在文档中找不到)arma::max(sum(square(m),1))
返回的确切数据类型
你已经测试过,无论它是什么 not 隐式转换为 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
temporaries 开始的答案发表了负面评论。那个答案被删除了。这并没有错。但我仍然会说这是错误的在没有看到模板元编程失败的情况下从那里开始,虽然我不确定,但使用 auto
试图绕过元编程失败可能是错误的。)
如果要将 1x1 矩阵转换为纯标量(如双精度),请使用 as_scalar() 函数。产生 1x1 矩阵的任何犰狳表达式也是如此。
最好在 Whosebug 上发布问题之前通读 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;
这是我在第 3 行遇到错误(类型不匹配)的代码。 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))
将结果打印到控制台,但将任何数字添加到输出标志错误。
您没有告诉我们(我在文档中找不到)arma::max(sum(square(m),1))
你已经测试过,无论它是什么 not 隐式转换为 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
temporaries 开始的答案发表了负面评论。那个答案被删除了。这并没有错。但我仍然会说这是错误的在没有看到模板元编程失败的情况下从那里开始,虽然我不确定,但使用 auto
试图绕过元编程失败可能是错误的。)
如果要将 1x1 矩阵转换为纯标量(如双精度),请使用 as_scalar() 函数。产生 1x1 矩阵的任何犰狳表达式也是如此。
最好在 Whosebug 上发布问题之前通读 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;