Примеры ArrayFire примерно1 / примерно2

Кто-нибудь знает, как использовать функции ArrayFire приблизительно1/приблизительно2? Я не могу найти примеры их использования в Интернете, и поэтому не могу понять, какими именно должны быть массивы позиций интерполяции. Я пробовал af::approx2(inArray, af::where(inArray some condition), af::where(inArray some other condition), AF_INTERP_NEAREST) вместе с аналогичными примерами, где af::where() заменяется чем-то вроде af::isNaN(), и что бы я ни пытался, я не могу заставить работать приблизительно 1 или приблизительно 2. Спасибо за помощь!

Изменить: конкретная проблема, с которой я сталкиваюсь, связана с двумя параметрами af::array, где выше я утверждаю, что пробовал af::where(...). Я не знаю, какие конкретно типы af::array передать. Описание документации

массив содержит места интерполяции

не помогает определить, что мне нужно передать этим функциям. af::where() и af::isNaN(), обе функции, которые возвращают массивы, описывающие позиции элементов, вызывают af::exception во время выполнения.


person solyuina    schedule 02.07.2018    source источник
comment
Если вы не знаете, как использовать API какой-либо библиотеки, вам следует прочитать руководство и изучить примеры. Из вашего поста не понятно какая у вас проблема, как вы пытались ее решить и какие результаты получили и ожидаете.   -  person Nikita Kniazev    schedule 03.07.2018
comment
В документации нет примеров, а в коде примера, упакованном с установкой ArrayFire, нет ни одного примера использования какой-либо функции интерполяции. Каждый результат на первых двух страницах Google с использованием различных ключевых слов не содержал примеров. Вы раньше смотрели документацию ArrayFire? Он не включает примеры для большинства функций. В нем просто указано, какой тип параметра требуется для функций интерполяции, и ничего более конкретного. Присвоение этим функциям параметров правильного типа вызывает необработанную ошибку af::exception.   -  person solyuina    schedule 03.07.2018
comment
Если я вас правильно понял, у вас проблемы с выполнением условной замены значений в массиве, но не с фактическими функциями approx1/approx2. Если это так, посмотрите здесь свой ответ stackoverflow.com/questions/36263133/   -  person Nikita Kniazev    schedule 03.07.2018
comment
Чтобы еще раз уточнить, интерполяция включает использование других значений в inArray для замены значений в определенных местах. В моем случае я пытаюсь реализовать замену ближайшего соседа для значений NAN в массиве. Это не то же самое, что условная замена.   -  person solyuina    schedule 03.07.2018
comment
Предлагают ли модульные тесты для этих функций какие-либо рекомендации по использованию?   -  person Ralf Stubner    schedule 06.07.2018


Ответы (2)


Как указано в документах, approx1 принимает следующие аргументы:

af::approx1 ( const array & in,
        const array & pos,
        const interpType method = AF_INTERP_LINEAR,
        const float offGrid = 0.0f )

В то время как in, method и offGrid описаны, точный эффект pos не описан. Решение простое: предполагается, что входные данные в массиве in лежат на сетке с шагом 1.

Это означает, что вы должны соответствующим образом масштабировать свой pos-массив. Предположим, что ваши входные данные длины N были расположены в позициях x с dx = x[i+1]-x[i], тогда интерполированное представление ваших данных лежит на сетке x[i]/dx.

Например. если бы все данные были интерполированы в сетку xnew, аргумент pos нужно было бы масштабировать до pos = xnew/dx.

Это подразумевает, конечно, что approx1 (а также approx2) может работать только на равномерно распределенных сетках, что также не упоминается в документах.

person Juergen    schedule 24.10.2018

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

person pradeep    schedule 22.01.2019