Внедряване на периодични гранични условия на PDE интегратор в C++

Трябва да внедря в C++ интегратор с крайни разлики на частично диференциално уравнение. В Python използвах метода numpy.roll, за да превъртя масива и по този начин да получа периодични гранични условия.

Има ли библиотека в C, която ще ми даде този метод? Тоест, когато имам достъп до позиция n+1 на вектор с дължина n, тя ще сочи към клетката на място 0 на вектора?


person Ohm    schedule 25.03.2015    source източник


Отговори (1)


Можете да използвате оператора mod, за да коригирате индекса.

#include <vector>

using namespace std;

int roll(vector<int>& v, unsigned int n) {
   return v[n % v.size()];
}

int main() {
   vector<int> v;
   for (int i=0; i<10; ++i) {
      v.push_back(i);
   }

   return roll(v, 2);
}

За да превъртите целия вектор, използвайте тази функция:

vector<int> rollVector(const vector<int>& v, unsigned int n) {   
   auto b = v.begin() + (n % v.size());
   vector<int> ret(b, v.end());
   ret.insert(ret.end(), v.begin(), b);
   return ret;
}
person Mustafa Ozturk    schedule 25.03.2015
comment
Предполагам, че roll(v, 2) ми дава целия вектор, превъртян с 2 индекса? - person Ohm; 26.03.2015
comment
Не, нов вектор не се създава. Само индексът, където i ›= n, е съпоставен с правилната стойност. Примерът по-горе roll(v, 11) ще върне v[1]. - person Mustafa Ozturk; 26.03.2015