Как создать наиболее эффективную линейную интерполяцию в С++?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как создать наиболее эффективную линейную интерполяцию в С++?

Сообщение Anonymous »

Я написал код для линейной интерполяции огромного количества значений. 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»