Масштабировать значения из меньшего массива в больший массив - PullRequest
0 голосов
/ 07 сентября 2011

У меня есть массив размером 256. Этот массив имеет элементы в диапазоне от 0 до 1.Теперь мне нужен массив, размер которого должен быть 65536, где каждый элемент должен быть интерполирован или масштабирован из исходного массива из 256 значений.Я спросил в другом потоке, но я не был достаточно ясен: (

Какой-то тип отображения, где, скажем, 10 значений из исходного изображения должны соответствовать большему количеству значений в большем массиве. Это выполнимо?

РЕДАКТИРОВАТЬ: допустим, у меня есть массив с 256 числами с плавающей запятой, каждый с плавающей точкой находится в диапазоне от 0 до 1. Теперь мне нужен новый массив, который должен быть 65536 с плавающей запятой каждый раз с плавающей точкой в ​​диапазоне от 0 до 1. Этиновые значения с плавающей точкой должны быть интерполированы или масштабированы из исходных 256 значений с плавающей точкой.

Ответы [ 2 ]

3 голосов
/ 08 сентября 2011

Отказ от ответственности: Мой C ++ не так хорош в наши дни. Это будет выглядеть как Java. Я предполагаю, что вы все равно не планировали копировать и вставлять: знание алгоритма гораздо важнее языка реализации.

Следующий алгоритм НЕ создает 65536 записей для ввода 256 записей. Вместо этого он составляет 65281. Причина этого в том, что вам нужно масштабировать ОТ чего-то до чего-то другого. Рассмотрим забор с 256 постами. У вас будет только 255 секций забора. Каждое масштабирование соответствует разделу забора. Для простой математики я делаю количество образцов между каждым исходным образцом равным количеству исходных образцов. Таким образом, если вы введете 4 входа, вы получите 13 записей. Вход с 100 входами сделает выход с 9901.

Наслаждайтесь!

std::vector<double> sample(std::vector<double> orig) {

    std::vector<double> result(orig.size() * (orig.size() - 1) + 1);

    /* for each value, make that many values scaled between this and the last piece */
    for(int i = 0; i < orig.size() - 1; i++) {
        double last = orig[i];
        double curr = orig[i+1];
        double diff = curr - last;
        double step = diff / orig.size();
        int offset = i * orig.size();
        for(int j = 0; j < orig.size(); j++) {
            result[offset + j] = last + (step * j);
        }
    }
    result[result.size() - 1] = orig[orig.size() - 1];
    return result;
}
3 голосов
/ 07 сентября 2011

Похоже, вы спрашиваете о преобразовании частоты дискретизации .Как лучше всего это сделать, зависит от значения ваших данных.Например, если ваш массив представляет звуковую волну, вы должны позаботиться о том, чтобы не вносить гармонические искажения, которые произошли бы, если бы вы использовали линейную интерполяцию.

Статья Википедии по интерполяции должна дать вам некоторыеначальные точки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...