Я написал код для линейной интерполяции огромного количества значений. Matlab способен выполнять интерполяцию очень быстро, но мой код на C++ занимает гораздо больше времени. Что я могу сделать по-другому, чтобы код работал быстрее?
int nearestNeighbourIndex(std::vector& x,double &value)
{
double dist;
int idx;
int i;
double newDist;
idx = -1;
dist = 999;//This is an absurdly large number meant to be replaced on
//the first iteration of the for loop
for ( i = 0; i < x.size(); i++ ) {
newDist = std::abs(value - x.at(i));
if ( newDist < dist ) {
dist = newDist;
idx = i;
}
}
return idx;
}
std::vector interpolate(std::vector x,std::vector v, std::vectorLinearSpaced){
std::vector v_new;
double dx, dv, m, b;
size_t x_max_idx = x.size() - 1;
size_t x_new_size = LinearSpaced.size();
v_new.reserve(x_new_size);
for (size_t i = 0; i < x_new_size; ++i)
{
size_t idx = nearestNeighbourIndex(x, LinearSpaced);
if (x[idx] > LinearSpaced)
{
dx = idx > 0 ? (x[idx] - x[idx - 1]) : (x[idx + 1] - x[idx]);
dv = idx > 0 ? (v[idx] - v[idx - 1]) : (v[idx + 1] - v[idx]);
}
else
{
dx = idx < x_max_idx ? (x[idx + 1] - x[idx]) : (x[idx] - x[idx - 1]);
dv = idx < x_max_idx ? (v[idx + 1] - v[idx]) : (v[idx] - v[idx - 1]);
}
m = dv / dx;
b = v[idx] - x[idx] * m;
v_new.push_back(LinearSpaced * m + b);
}
return v_new;
}
Подробнее здесь: https://stackoverflow.com/questions/784 ... ation-in-c
Как создать наиболее эффективную линейную интерполяцию в С++? ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как создать std::string со встроенными значениями, т.е. «интерполяцию строк»?
Anonymous » » в форуме C++ - 0 Ответы
- 19 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как создать std::string со встроенными значениями, т.е. «интерполяцию строк»?
Anonymous » » в форуме C++ - 0 Ответы
- 15 Просмотры
-
Последнее сообщение Anonymous
-