簡體   English   中英

使用 Eigen 時出錯:無效使用不完整類型 'const class Eigen

[英]Error using Eigen: invalid use of incomplete type ‘const class Eigen

我有以下有效的代碼:

Matrix <float, ny+1, nx> eXX;
eXX.setZero();

Eigen::Matrix< double, (ny+1), (ny)> u; 
    u.setZero(); 
    for(int i = 0; i< nx; i++){
        for(int j = 0; j< ny+1; j++){
            eXX(j + (ny+1)*i) = (i)*2*EIGEN_PI/nx; 
            u(j + (ny+1)*i) = cos(eXX(j + (ny+1)*i));
        }
    }

但是當我編寫以下內容時,它不起作用:

Matrix <float, ny+1, nx> eXX;
eXX.setZero();

Eigen::Matrix< double, (ny+1), (ny)> u; 
    u.setZero(); 
    for(int i = 0; i< nx; i++){
        for(int j = 0; j< ny+1; j++){
            eXX(j + (ny+1)*i) = (i)*2*EIGEN_PI/nx; 
        }
    }
u = eXX.matrix().cos();// -or- std::cos(eXX.array());
    std::cout << u << "\n"; //error

完整的錯誤信息:

Test.cpp:418:23: error: invalid use of incomplete type ‘const class Eigen::MatrixFunctionReturnValue<Eigen::Matrix<float, 11, 10> >’
  418 |  u = eXX.matrix().cos();
      |                       ^
In file included from /mnt/c/Users/eigen-3.4.0/eigen-3.4.0/Eigen/Core:163,
                 from /mnt/c/Users/eigen-3.4.0/eigen-3.4.0/Eigen/Dense:1,
                 from Test.cpp:21:
/mnt/c/Users/eigen-3.4.0/eigen-3.4.0/Eigen/src/Core/util/ForwardDeclarations.h:305:34: note: declaration of ‘class Eigen::MatrixFunctionReturnValue<Eigen::Matrix<float, 11, 10> >’
  305 | template<typename Derived> class MatrixFunctionReturnValue;

我想我可以嘗試在不使用 for 循環的情況下重寫eXX並通過它,但這也行不通。 另外,我讀到有人建議添加類似#include <MatrixFunctionReturnValue>的內容,這實際上使事情變得更糟。 謝謝。

我在這里也添加了我的包含:

#define _USE_MATH_DEFINES 
#include <cmath>
#include<math.h>
#include<stdio.h>
#include "fftw3.h"
#include <cstring>
#include <sstream>
#include <string>
#include <sys/resource.h>
#include <iostream> 
#include <vector>
#include <fstream> 
#include <iomanip>
#include <numeric>
#include <assert.h>
#include <Eigen/Dense>
#include <unsupported/Eigen/FFT>
#include <Eigen/SparseCore> 
#include <Eigen/Sparse>

Matrix類是為線性代數構建的。 當您想要對矩陣的元素進行操作時,您需要使用Array類。 請參閱 有關 Array 的 Eigen 文檔 另一種方法是使用unaryExpr將矩陣的每個元素作為輸入。

以下是這兩種方法:

#include <iostream>
#include <Eigen/Dense>
....
Eigen::Matrix<double, 3, 3> vals;
vals.setZero();
std::cout << vals << '\n';
std::cout << "******\n";
std::cout << vals.array().cos() << '\n';
std::cout << vals << '\n';
std::cout << "******\n";
Eigen::Matrix<double, 3, 3> res = vals.unaryExpr([](double a) { return cos(a); });
std::cout << res << '\n';
std::cout << vals << '\n';

請注意vals如何隨各種操作發生變化(並且不會發生變化)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM