繁体   English   中英

如何使用向量执行数组计算?

[英]How can I perform array calculations with Vectors?

我一直在阅读,并且在很多地方都推荐使用向量,而不是数组,但是我仍然不完全了解,我不确定它们是否可以在我的项目中使用。

我正在做CFD计算,我必须进行如下计算,

for(int i = 1 ; i < M ; i++) {
    for(int j = 1 ; j < N ; j++) {
        for(int k = 0 ; k < 4 ; k++) {
            dU_dX_plus=(U[i+1][j+1][k]+dU_dT[i+1][j+1][k]*dt/2+U[i+1][j][k]+dU_dT[i+1][j][k]*dt/2-2*U_p[i][j][k])/dx;
            dU_dX_min=-(U[i][j+1][k]+dU_dT[i][j+1][k]*dt/2+U[i][j][k]+dU_dT[i][j][k]*dt/2-2*U_p[i][j][k])/dx;
            dU_dX[i][j][k]=Wfunct(dU_dX_plus, dU_dX_min);

            dU_dY_plus=(U[i+1][j+1][k]+dU_dT[i+1][j+1][k]*dt/2+U[i][j+1][k]+dU_dT[i][j+1][k]*dt/2-2*U_p[i][j][k])/dy;
            dU_dY_min=-(U[i][j][k]+dU_dT[i][j][k]*dt/2+U[i+1][j][k]+dU_dT[i+1][j][k]*dt/2-2*U_p[i][j][k])/dy;
            dU_dY[i][j][k]=Wfunct(dU_dY_plus, dU_dY_min);
        }
    }
}

我可以用向量实现它吗? 如果是这样,我该怎么办? 这值得还是应该继续使用数组?

谢谢,

vector的优点是,内存直接在堆上分配。 这意味着您也可以使用很大的数组。 这对于3D阵列尤其重要。 请记住:大小为100x100x100的浮点数组占用4MB的内存-在大多数情况下,堆栈占用太多内存。

通过使用vector而不是固定大小的数组,您还可以实现具有动态大小的数组,即在运行时不固定大小的数组。

您可以这样做:

struct Array3D {

    int N, M, K; // size of array

    std::vector<float> U; // storage

    Array3D(unsigned n, unsigned m, unsigned k)
    : N(n), M(m), K(k), U(n*m*k) {}

    float index(unsigned i, unsigned j, unsigned k) const {
        return (i*M + j)*K + k;
    }

    float operator()(unsigned i, unsigned j, unsigned k) const {
        return U[index(i,j,k)];
    }

    float& operator()(unsigned i, unsigned j, unsigned k) {
        return U[index(i,j,k)];
    }
};

Array3D U(6,7,8);
U(1,2,3) = U(2,3,4) + U(2,3,2);

我个人认为U(i+1,j+1,k)U[i+1][j+1][k]更具可读性和可写性。

您也可以使用boost :: multi_array

std::vector只不过是围绕堆分配的数组和数组大小的包装器。 您可以使用向量来执行大多数操作,而向量可以使用堆分配的数组来执行。

通常建议使用std::vector而不是原始c ++数组,这有两个原因:

  1. 因为std::vector是类型安全的。 原始数组会忘记它们是数组,并且很容易忘记它们的大小,这可能导致无效的内存访问。
  2. 因为std::vector管理堆分配的数组的生存期,而不是要求您手动使用new[]delete[] ,所以容易出错。

std::vector一个缺点是,它不像多维数组那样方便使用。

double U[M][N][4];
U[i][j][k];

您可以将多维数组展平为一个维度:

std::vector<double> U(M * N * 4);
U[N*4*i + 4*j + k]

另一种选择是编写自己的类型安全的资源管理类,该类充当多维数组。

class _2d_array {
  std::vector<double> arr;
public:
  const int rows, columns;
  _2d_array(int rows, int columns) : arr(rows * columns), rows(rows), columns(columns) {}

  struct row_proxy {
    _2d_array &arr;
    int row;
    double &operator[] (int column) { return arr.arr[arr.columns*row + column]; }
  };

  row_proxy operator[] (int row) { return row_proxy{*this, row}; }
};

_2d_array U(M, N);
U[i][j] = 10.23;

...建议在arrays vectors ,但是我仍然不完全了解,我不确定它们是否可以在我的项目中工作。

arrays是C ++ 11的功能。 它们的大小也固定。

vectors很容易获得。 它们是动态的,可以更改大小。

使用最适合您情况的方法。 如果需要C ++ 03,则必须使用vector 如果需要增加数组,请使用vector

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM