как я могу использовать значение позиции пикселя «x» (Halide::Var) в качестве ограничения цикла for?

Я новичок в Галиде.

Я пытаюсь сделать некоторые вычисления, где позиция пикселя «x» должна быть установлена ​​​​как предел цикла for. Для этого я написал следующий код, но, похоже, я не могу использовать галоидную переменную в качестве ограничения цикла for.

Есть ли решение для этого?

Мой код:

Halide::Var x, y;

Halide::Expr L;

Halide::Func mat,A;

L = 0;

for (int k=1; k<=x-1; k++)

        L +=  mat(k,y) * mat(k,x);

mat(x,y) = Halide::select(x==y, (A(x, y) - L),

                              y>x, (A(x,y) - L)/mat(x,x),

                              0);

он дает сообщение об ошибке:

"ошибка: не удалось преобразовать 'Halide::operator‹=(int, Halide::Expr) Halide::operator-(Halide::Expr, int)(1))' из 'Halide::Expr' в 'bool' для (целое k=1; k‹=x-1; k++)"


person Nusrat Jemy    schedule 29.08.2019    source источник
comment
Кажется, Halide не хватает некоторых перегрузок. Спроси их. А пока попробуйте использовать Var k вместо int k.   -  person Ripi2    schedule 29.08.2019
comment
Привет, в обычном цикле for нельзя использовать Halide::Var. нужно преобразование из Halide::Var. Есть ли Halide for loop?   -  person Nusrat Jemy    schedule 29.08.2019
comment
в цикле for Почему бы и нет? Я ничего не знаю о Halide, но полагаю, что они занимаются вар-арифметикой. Если нет, снова спросите команду Halide.   -  person Ripi2    schedule 29.08.2019
comment
Как спросить команду Halide?   -  person Nusrat Jemy    schedule 29.08.2019
comment
На их сайте есть несколько ссылок. Я предлагаю gitter.   -  person Ripi2    schedule 29.08.2019


Ответы (1)


Halide::Expr и Halide::Var не имеют явных значений во время компиляции C++; они являются заполнителями для значений, выраженных в результирующем коде Halide. Таким образом, вы не можете использовать их в цикле C++ for. Эквивалентом в Halide является использование RDom для указания явного диапазона, например,

    Halide::RDom k(1, x-1);  // RDom is [min, extent], not [min, max]
    Halide::Expr L;
    L = 0;
    L += mat(k,y) * mat(k,x);

или, проще говоря,

    Halide::RDom k(1, x-1);  // RDom is [min, extent], not [min, max]
    Halide::Expr L = Halide::sum(mat(k,y) * mat(k,x));
person Steven Johnson    schedule 29.08.2019
comment
Большое спасибо, Стивен Джонсон! Я попробую с вашим предложением. :-) - person Nusrat Jemy; 29.08.2019
comment
Я не думаю, что вы можете использовать Vars в рамках RDom. Возможно, вы захотите установить правдоподобную верхнюю границу, а затем использовать RDom::where, чтобы обрезать ее до нужного вам диапазона: RDom r(k, 1, 1024); г. где (г ‹ х); - person Andrew Adams; 29.08.2019
comment
Да, вы правы, Эндрю Адамс! Я не могу использовать Var в качестве границ RDom. Мне нужно указать конкретные значения в качестве привязки RDom. Итак, мне нужно найти другое решение для этого. - person Nusrat Jemy; 30.08.2019
comment
Спасибо Стивену Джонсону и Эндрю Адамсу! он отлично работает с RDom::where. Но есть еще одна проблема, я должен написать новый Вопрос? Как и в моем вопросе, для некоторых более поздних матов (x, y) требуется предыдущее значение мата (x, y). то есть это рекурсивная функция. Но выдает ошибку: Невозможно вызвать Func mat, так как он еще не определен. Программа неожиданно завершилась. ------что делать сейчас? - person Nusrat Jemy; 30.08.2019