0

I'm programming an evolutive algorithm which, I'm having trouble trying to access the data I store in a dynamic matrix like this:

//tam_pob = size of population, is a constant value //n is a parameter received from user

float (* x)[tam_pob] = new (nothrow) float [n][tam_pob];
float(* factor)[tam_pob] = new (nothrow) float [n][tam_pob];


    if(x== 0 || factor == 0)
            cout<<"ERROR...";
    else{

            srand( time( NULL ) );

        for(int j=0;j<tam_pob;j++) // individuos

           for(int i=0;i<tam;i++){ //cromosomas

              //filling the matrix

              x[i][j]=(double) pow(-1.0,(rand()%4))*rand()+rand()/100000.0;
              factor[i][j]=(double) pow(-1.0,(rand()%4))*rand()+rand()/100000.0;


            }

but when I try to print the values, the program print something very different that is supposed to be stored in the matrix. Also it crashes when the value of the size of population is bigger than 250 aprox., I'm supposed to do it with even bigger size of population like 1k,10k and 100k. any ideas?

4

2 回答 2

0
  • 这可能是因为您的数组初始化。在 C++ 中初始化双精度数组有点复杂,特别是如果您使用诸如 N 之类的不确定变量对其进行初始化。我建议您像这样初始化它:

    浮动 ** x = 新浮动 *[n];
    浮动 **因子 = 新浮动 *[n];

    for(int i=0; i < n; i++){

    x[i] = 新浮点数[tam_pob];

    因子[i] = 新浮点数[tam_pob];}

  • 由于 N 和 tam_pob 未确定,您可以在测试时传递它们,这样您就不会引发 ArrayOutOfBound 异常或空指针引用。
  • 您需要担心的其他事情是您的矩阵具有由 N 和 Tam_pob 变量表示的不同大小。如果这两个变量的大小不同,您需要分别循环遍历每个存储桶,因此您的 for 循环应该使用 N 和 tam_pob 来检查数组绑定。
于 2013-09-19T17:40:51.993 回答
0

如果您只是想创建一个二维数组,为什么不使用 STL 的向量或数组类,其中每个元素也是一个数组/向量,正如 Neil 所说的那样?

如果您想避免使用 STL,这可能是您需要的:

float** x = new float*[n];
for(size_t i = 0; i < n; ++i)
    x[i] = new float[tam_pob];

然后 x 是一个 nx tam_pob 浮点数组,您可以对其进行索引x[3][4],例如。

顺便说一句,括号x使factor您看起来像是在尝试声明函数指针。

如果您要编写大量使用矩阵的代码,那么专门的库可能会让您的生活更轻松,例如http://www.boost.org/doc/libs/1_42_0/libs/numeric/ublas/文档/矩阵.htm

#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/io.hpp>

int main () {
  using namespace boost::numeric::ublas;
  matrix<double> m (3, 3);
  for (unsigned i = 0; i < m.size1 (); ++ i)
    for (unsigned j = 0; j < m.size2 (); ++ j)
      m (i, j) = 3 * i + j;
  std::cout << m << std::endl;
}
于 2013-09-19T17:22:36.017 回答