2017-06-10 229 views
0

是否可以從生成器類中的數組初始化Func?代碼應該看起來像這樣。從數組初始化Func

class SobelConv: public Halide::Generator<SobelConv> { 

const signed char kernelx[3][3] = { 
    {-1, 0, 1}, 
    {-2, 0, 2}, 
    {-1, 0, 1} 
}; 

void generate() { 
    for (int y = 0; y < 3; y++) 
     for (int x = 0; x < 3; x++) 
      kernel_x(x, y) = kernelx[y][x]; 

    conv_x(x, y) += gray(x+win.x, y+win.y) * kernel_x(win.x + 1, win.y + 1); 
} 

Func kernel_x{"kernel_x"}; 

目前,我的做法是定義Input<Buffer<int8_t>> kernel_x。我不希望它成爲管道函數的參數,並且希望將kernel_x直接替換爲相應的數字。

回答

1

以下編譯並示出了這樣做的一種方法:

#include "Halide.h" 

class SobelConv: public Halide::Generator<SobelConv> { 
    signed char weights[3][3] = { 
    {-1, 0, 1}, 
    {-2, 0, 2}, 
    {-1, 0, 1} 
    }; 

    Input<Buffer<int8_t>> gray{"gray", 2}; 
    Halide::Buffer<int8_t> kernel_x{&weights[0][0], 3, 3}; 

    Output<Buffer<int8_t>> conv_x{"conv_x", 2}; 

    Var x, y; 
    RDom win{0, 3}; 

    void generate() { 
    conv_x(x, y) += gray(x+win.x, y+win.y) * kernel_x(win.x + 1, win.y + 1); 
    } 
}; 

的權重將被嵌入在編譯時生成的代碼。我們應該有一種方法來爲初始化列表中的權重提供常量值,但目前我還沒有找到它。

+2

如果你有一個靜態數組,'Halide :: Runtime :: Buffer'可以用數組'kernel_x {weights}'初始化。維度和範圍被檢測到。 –