2009-08-26 2 views
0

я есть зЬй :: вектор, а именноуказатель арифметика векторов в C++

vector<vector<vector> > > mdata; 

я хочу передать данные из моего mdata вектора функции GSL

gsl_spline_init(gsl_spline * spline, const double xa[], const double ya[], size_t size); 

, как я. я уже понял, что я могу делать вещи, как

gsl_spline_init(spline, &(mgrid.front()), &(mdata[i][j][k].front()), mgrid.size()); 

это нормально, если я хочу, чтобы передать данные от mdata для фиксированного I, J к gsl_spline_init().

Однако теперь мне нужно будет пройти по первому размеру mdata, поэтому при фиксированном j, k.

Я знаю, что для любых двух фиксированных индексов все векторы вдоль остальных размеров имеют одинаковую длину, поэтому мой вектор является «регулярным кубом». поэтому смещение между всеми значениями, которые мне нужны, должно быть одинаковым.

конечно я мог бы создать временный вектор

int j = 123; 
int k = 321; 
vector<double> tmp; 
for (int i = 0: i < mdata.size(); i++) 
    tmp.push_back(mdata[i][j][k]); 
gsl_spline_init(spline, &(mgrid.front()), &(tmp.front()), mgrid.size()); 

, но это кажется слишком сложным. возможно, есть способ достичь моей цели с помощью арифметики указателя?

любая помощь очень ценится :)

+0

Возможно, вам захочется найти один из матричных классов, скрывающихся в Интернете. вектор векторных запахов. – gimpf

ответ

1

Вы действительно не можете сделать это без изменения структуры функции массива потребительских gsl_spline_init() - она ​​опирается на данные прошли будучи непрерывный блок данных. Это не относится к вам трехуровневый вектор - это не только куб, но и каждый уровень имеет отдельный буфер, выделенный в кучу.

1

Этого не может быть сделано. Не только с векторами, но даже с обычными массивами только последнее измерение является непрерывным блоком данных. Если gsl_spline_init взял итератор вместо массива, вы можете попытаться создать какой-то функтор для выбора подходящих данных, но я не уверен, что это стоит попробовать. Никакая арифметика указателей не может вам помочь.

+0

Массив 'int a [5] [6] [7];' находится в непрерывной памяти и может перемещаться последовательно по указателю. –

+0

Я имел в виду, что значения a [1] [2] [0], [1] [2] [1], [1] [2] [2] и т. Д. Образуют смежную часть памяти, и они могут передается функция. Значения a [0] [1] [2], a [1] [1] [2], [2] [1] [2] не образуют смежной части памяти, и они не могут быть переданы в функция. –

Смежные вопросы