在Armadillo稀疏矩阵中使用max函数时出错
Error in using max function with Armadillo sparse matrices
这是我在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))
将结果打印到控制台,但将任何数字添加到输出标志错误。
如果要将1x1矩阵转换为纯标量(如double),请使用as_scalar()函数。同样适用于任何产生1x1矩阵的Armadillo表达式。
在Stackoverflow上发布问题之前,最好先彻底阅读Armadillo文档。
修改您的示例:
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;
您没有告诉我们(我在文档中找不到)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
试图绕过元编程失败可能是错误的。)
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- std::max() 函数与定点实现的比较中的问题
- 没有函数模板的实例"max"与参数列表参数类型匹配(int、int)
- 为什么在这种情况下不能将 Max 用作函数?
- 从递归向后选择排序函数调用 max 和交换函数
- 为什么 c++ 编译器在对两种不同类型的数值变量使用"std::max()"函数时会出现错误
- 自动变量可存储函数指针到std :: max
- 如何查找具有一组整数的函数的'max absolute sum'
- 在调试中,如何知道对函数的重复调用中参数的统计数据(max-min,average,distribution..)
- 当我尝试编译程序时,我遇到了一堆错误,例如:'std::max':找不到匹配的重载函数
- int max(一个变量)和 int max(int ,int)之间没有冲突,这是 C++ 中的一个函数
- c++ PPL 并行工作 - 归约类 'combinable' 中的函数 max()
- 在Armadillo稀疏矩阵中使用max函数时出错
- 如何将大于 std::numeric_limits<fundamental_type>::max() 的值传递给函数?
- 为template类定义numeric_limits-max函数
- 如何在c++中创建一个max函数来搜索数列中的最大值?
- 为数组创建c++ max函数:处理数组大小为0的情况的正确方法是什么?