我有以下有效的代碼:
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;
我想我可以嘗試eXX在不使用 for 回圈的情況下重寫并傳遞它,但這也行不通。另外,我讀到有人建議添加類似的東西#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>
uj5u.com熱心網友回復:
該類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各種操作如何變化(和不變)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/494097.html
