|
Boost Users : |
From: Sebastien Fortier (sebastien.fortier_at_[hidden])
Date: 2006-06-13 13:08:16
Thank you for your reply Ronald,
I'm including the code I'm using just in case I did something wrong...
class MatrixAlgorithm3D {
public:
/////////////////////////////////////////////////
//in an other class I have a utility function that gets the maximum
values for every z vector in the array
//and returns the resulting plane of values
static array_type2D_ref maxPlan(array_type3D_const_ref matrix)
{
array_type2D
resultMatrix(boost::extents[matrix.shape()[0]][matrix.shape()[1]]);
array_type3D_const_ref::index_gen indices;
for (unsigned int x = 0; x < matrix.shape()[0]; x++) {
for (unsigned int y = 0; y < matrix.shape()[1]; y++) {
// get the z vector for these coordinates
array_type3D_const_ref::const_array_view<1>::type
dimensionZmatrix = matrix[ indices[x][y][range()] ];
resultMatrix[x][y] =
std::max_element(dimensionZmatrix.begin(), dimensionZmatrix.end());
}
}
return resultMatrix;
}
/////////////////////////////////////////////////
}
typedef boost::multi_array < double, 3 > array_type3D;
typedef boost::const_multi_array_ref < double, 3 > array_type3D_const_ref;
typedef boost::multi_array < double, 2 > array_type2D;
typedef boost::multi_array_ref < double, 2 > array_type2D_ref;
int main(void) {
array_type3D matrix(boost::extents[775][775][100]);
// lets say I initialise it this way (I usually get the values from
a flat file)
for (unsigned int x = 0; x < 775; x++) {
for (unsigned int y = 0; y < 775; y++) {
for (unsigned int z = 0; z < 100; z++) {
matrix[x][y][z] = avalue;
}
}
}
// then I call the function in my main program
array_type2D a= MatrixAlgorithm3D::maxPlan(matrix);
// should I use an array_type2D_ref for the return value instead?
// then I write the results to a flat file
...
return 0;
}
Ronald Garcia wrote:
>
> Hello Sebastien,
>
> Ideally, you should be able to work with an array of doubles, rather
> than an array of pointers to double. I can create an multi_array with
> the dimensions you mention.
>
> To answer your questions, multi_array uses a standard library
> allocator to allocate a contiguous block of memory in which to hold
> the array data. I'm afraid I do not know why you cannot exceed these
> limits.
>
> ron
>
>
>
>> I'm currently using multi_array to represent 3D matrices of doubles, I
>> was wondering which would be the best use since the array has to hold a
>> very large amount of data. I' currently testing whith a multi_array of
>> 800x800x100 to hold double or pointers to double and I have memory
>> problems. When I declare the multi_array whith pointers to doubles I can
>> usually go up to 775x775x100 without problems but when I try the same
>> thing with a multi_array of doubles I get a bad alloc error. My real
>> needs for the moment are for a multi_array of 800x600x57 but I will need
>> bigger storage capacity in the near future, what are your sugesstions.
>>
>> Is the multi_array a pointer itself?
>> How is memory management handled?
>> How can go beyond these limits?
>>
>>
>> --
>> Sébastien Fortier
>
>
>------------------------------------------------------------------------
>
>_______________________________________________
>Boost-users mailing list
>Boost-users_at_[hidden]
>http://lists.boost.org/mailman/listinfo.cgi/boost-users
>
-- Sébastien Fortier
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net