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

Error in using max function with Armadillo sparse matrices

本文关键字:max 函数 出错 Armadillo      更新时间:2023-10-16

这是我在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试图绕过元编程失败可能是错误的。)