我是C ++和特征库的新手。我想编写一些简单的东西,但不知道我哪里出错了。这是我的代码:
#include<iostream>
#include<Eigen\Dense>
#include<cmath>
#include<fstream>
using namespace std;
using namespace Eigen;
int main (int argc, char* argv[])
{
int n = 200;
Matrix<double, Dynamic,1> u_n;
u_n.setZero(n,1);
Matrix<double, Dynamic,1> u_n_minus_one;
u_n_minus_one.setZero(n,1);
Matrix<double, Dynamic,1> u_n_plus_one;
u_n_plus_one.setZero(n,1);
std::ofstream fileWriter ("Values.txt");
assert(fileWriter.is_open());
float r=2;
float F=100;
for (int t=0;t<=5;t=t+1)
{
u_n_plus_one (0,0) =0;
//source of error
u_n_plus_one.block(1,0,n-1,0) = pow(r,2)*( u_n.block(1,0,n-2,0)+ u_n.block(3,0,n,0)) + 2*(1-pow(r,2))*u_n.block(1,0,n-1,0)-u_n_minus_one.block(1,0,n-1,0);
//source of error
u_n_plus_one (floor(n/2),0)=F;
u_n_plus_one (n-1,0) =0 ; //corrected from (n,0) to (n-1,0)
u_n_minus_one = u_n ;
u_n = u_n_plus_one ;
//writing values to file
if (remainder(t, 10) == 0)
{
fileWriter<<u_n.transpose()<<std::endl;
}
}
fileWriter.close();
}
我试图声明一些矩阵(尽管它们是向量)。然后我正在对矩阵块进行操作,最后将结果写入文件。我没有得到任何编译时错误,但程序在运行期间崩溃。
我尝试调试代码,错误似乎位于 //错误源语句中。有人可以帮我这个吗?
答案 0 :(得分:2)
正如Block operations上的页面所述,matrix.block(i,j,p,q)
表示从p
条目开始的q
行和(i,j)
列的块。我认为程序中的u_n.block(3,0,n,0)
应该引用从(3,0)条目开始并在(n
,0)条目处开始的块,但实际上它指的是块从(3,0)条目开始,大小(n
,0)。从(3,0)条目开始并在(n
,0)条目处结束的块由u_n.block(3,0,n-2,1)
或u_n.segment(3,n-2)
或u_n.tail(n-2)
表示;看到开头提到的链接。