0

我有一个函数将“模拟域”转换为体素数组(3D 像素)。每个体素可以是 0 或 1,或者至少是falsetrue。由于域可以非常大,因为离散化步骤可以非常小,它需要非常大量的内存。

我使用我的体素数组使用 FFTW3 执行散射模拟(在这种情况下,如果函数可以在double[2](FFTW3 已知的复杂类型,以便我可以执行就地变换)的数组上工作,那就太好了。但是当我使用我的体素数组执行“简单”操作(例如体积分数估计)我只希望我的数组是我可以使用的最小类型,所以布尔数组就可以了。

我在想类似以下的事情:

#include <iostream>
int N = 10 ;


template<typename T>
void voxelizator(T* & Voxels) {
    // N = total number of voxels, stored in a row-major 1D array
    if (Voxels==NULL) Voxels = new T[N] ; //
    for (int n = 0 ;  n < N ; n++) Voxels[n] = T(0) ;
    { // Code to voxelizate the space -- DUMB condition 
        for (int n = 0 ; n<N ; n++) if (n%2==0) Voxels[n] = T(1) ;
    }
}



int main()
{
    int * voxOfInt = NULL ;
    std::cout << "Array of int :" << std::endl ;
    voxelizator(voxOfInt) ;
    std::cout << "Done" << std::endl ;
    for (int n = 0 ; n < N ; n++)  std::cout << n << "\t" << voxOfInt[n] << std::endl ;
    delete[] voxOfInt ;

    bool * voxOfBool = NULL ;
    std::cout << "Array of boolean " << std::endl ;
    voxelizator(voxOfBool) ;
    std::cout << "Done" << std::endl ;
    for (int n = 0 ; n < N ; n++)  std::cout << n << "\t" << voxOfBool[n] << std::endl ;
    delete[] voxOfBool ;

}

但是ISO C++ forbids casting to an array type 'double[2]'当我使用 double[2] 数组(来自 FFTW3 的复数)(或本例中的 int[2] 调用此函数时,会触发该错误:)

...    
typedef double complex [2]  ;
...
// in main {}

    complex * voxOfArray = NULL ;
    std::cout << "Array of an array " << std::endl ;
    voxelizator(voxOfArray) ; // It fails to call the T(0) at compile time, but i would be more than happy to explain g++ what is T(0) for int[2] ...
    std::cout << "Done" << std::endl ;
    for (int n = 0 ; n < N ; n++)  std::cout << n << "\t" << voxOfArray[n] << std::endl ;
    delete[] voxOfArray ;

问题是:我在哪里可以给 g++ 类型转换的接收方:

  • 当 T 为 double[2] 时,T(0) 到 {0,0} 和 T(1) 到 {1,0} ?
  • 当 T 是布尔值时,T(0) 变为 FALSE,T(1) 变为 TRUE?

注意:一个类型的函数调用运算符对我来说似乎很奇怪,但我知道它可以与我已经使用的以下符号函数一起正常工作(请在此处插入狗做化学的图片并说“我不知道我“正在做”)

template <typename T> int sign(T value) {
    return (T(0) < value) - (value < T(O)) ; 
}
4

1 回答 1

0

如果您使用的是 C++11:您可以使用如下辅助结构:

struct voxel_t {
    double val_[2];
    voxel_t() : val_{0.0, 0.0}{};
    explicit voxel_t(bool b): val_{double(b), 0.0}{};
};

template<typename T>
void voxelizator(T* Voxels) {
    // N = total number of voxels, stored in a row-major 1D array
    if (Voxels==NULL) Voxels = new T[N]{} ; // performs below initialization
    //for (int n = 0 ;  n < N ; n++) Voxels[n] = T(0) ;  // no longer needed
    { // Code to voxelizate the space 
        for (int n = 0 ; n<N ; n++) if (is_Matter(n)) Voxels[n] = T{true};
    }
}

ideone上的示例用法。

这解决了 double[2] 的情况,对于 bool,您不需要做任何特别的事情。

于 2013-04-22T12:49:18.427 回答