머리말
"Playing with ArrayFire : 08 Array and Matrix Operations"에서는 ArrayFire의 통합 백엔드에 대해 배웠으며이 기사에서는 Forge에서 ArrayFire의 시각적 작업을 계속 학습 할 것입니다.
1. 소개
라이브러리로서 ArrayFire는 고성능, 병렬 및 GPU 컴퓨팅을위한 강력하고 사용하기 쉬운 플랫폼을 제공하는 것을 목표로합니다. Forge -OpenGL 시각화 라이브러리-목표는 동일한 강력한 시각화를 제공하고 Arrayfire 데이터 구조 및 OpenGL 상호 운용성을 활성화하는 것입니다.
Arrayfire는 af :: array 를 시각화하기위한 간단한 인터페이스로 설계된 래퍼 함수를 제공합니다 . 이러한 기능은 다양한 상호 운용성 작업을 수행합니다. 한 가지 특별한 예는 GPU에서 호스트로 데이터를 복사하고 다시 포맷 한 다음 GPU로 다시 포맷하는 데 시간을 낭비하는 대신 GPU 데이터 에서 GPU 프레임 버퍼 로 데이터 를 직접 추출 할 수 있다는 것입니다! 이것은 2 개의 메모리 사본을 저장합니다.
시각화는 마우스로 조작 할 수 있습니다. 다음 조치를 취할 수 있습니다.
-Zoom (Alt + 마우스 왼쪽 버튼 클릭, 위아래로 이동
)
-Pan ( 왼쪽 클릭 및 드래그) -Rotate (오른쪽 마우스 버튼-볼 회전 추적)
이제 Forge를 사용 하여 보여줄 수 있는 시각 효과의 종류와 Arrayfire가 두 라이브러리 간의 데이터를 처리하는 방법을 살펴 보겠습니다.
둘째, 창 설정
Forge 함수를 호출하기 전에 관련된 " canvas "클래스 를 만들어야합니다 . Forge 함수가 af :: Window 클래스 에 추가되었습니다 . 먼저 창을 만들어 보겠습니다.
const static int width = 512, height = 512;
af::Window window(width, height, "2D plot example title");
do{
//drawing functions here
} while( !window.close() );
ArrayFire는 또한 그리기 루프를 추가하므로 Forge 의 그리기 기능을 사용하여 창을 그릴 수 있습니다.
세, 그리기 기능
다음은 몇 가지 일반적인 그리기 기능을 소개합니다.
1. 이미지
af :: Window :: image ()의 기능은 그레이 스케일 또는 컬러 이미지를 그리는 것입니다. 회색조 이미지를 그리려면 2D 배열이 함수에 전달되어야합니다. 정적 노이즈의 예를 살펴 보겠습니다.
array img = constant(0, width, height); //make a black image
array random = randu(width, height); //make random [0,1] distribution
img(random > 0.5) = 1; //set all pixels where distribution > 0.5 to white
window.image(img);
이전 예제를 조정하여 이미지의 RGB 값을 3으로 설정하면 색상 노이즈가 생성됩니다.
array img = 255 * randu(width, height, 3); //make random [0, 255] distribution
window.image( img.as(u8) );
참고 : Forge 는 ArrayFire에서 전달 된 모든 af :: array 유형을 자동으로 처리합니다 . 첫 번째 예에서는 범위가 [0,1] 인 부동 소수점 이미지를 전달했습니다. 이전 예에서는 배열을 [0,255] 범위의 부호없는 바이트 배열로 변환했습니다. 모든 Forge 그리기 기능의 유형 처리 속성은 일관됩니다.
2. 플롯
af :: Window :: plot () 함수는 배열을 2 차원 선 그래프로 시각화합니다. 간단한 예를 살펴 보겠습니다.
array X = seq(-af::Pi, af::Pi, 0.01);
array Y = sin(X);
window.plot(X, Y);
플롯 함수에는 다음과 같은 특성이 있습니다.
void plot( const array &X, const array &Y, const char * const title = NULL );
이 점의 x 및 y 좌표는 그리기에 필요합니다. 이러한 매개 변수는 균일하지 않거나 매개 변수화 될 수 있습니다.
array t = seq(0, 100, 0.01);
array X = sin(t) * (exp(cos(t)) - 2 * cos(4 * t) - pow(sin(t / 12), 5));
array Y = cos(t) * (exp(cos(t)) - 2 * cos(4 * t) - pow(sin(t / 12), 5));
window.plot(X, Y);
3. 플롯 3
af :: Window :: plot3 () 함수에는 다음과 같은 특성이 있습니다.
void plot3 (const array &in, const char * title = NULL);
입력 배열은 XYZ 좌표를 순서대로 입력해야합니다. 이러한 점은 1 차원 (3n x 1) 배열 또는 (3 xn) 또는 (nx 3) 행렬 일 수 있습니다.
array Z = seq(0.1f, 10.f, 0.01);
array Y = sin(10 * Z) / Z;
array X = cos(10 * Z) / Z;
array Pts = join(1, X, Y, Z);
//Pts can be passed in as a matrix in the from n x 3, 3 x n
//or in the flattened xyz-triplet array with size 3n x 1
window.plot3(Pts);
//both of the following are equally valid
//window.plot3(transpose(Pts));
//window.plot3(flat(Pts));
4. 히스토그램
af :: Window :: hist ()의 기능은 입력 배열을 히스토그램으로 렌더링하는 것입니다. 아래 예제에서 입력 배열은 각 샘플을 계산하고 저장하는 Arrayfire의 histogram () 함수를 사용하여 생성됩니다 . histogram () 의 출력은 af :: Window :: hist () 함수에 직접 입력 할 수 있습니다 .
const int BINS = 128; SAMPLES = 9162;
array norm = randn(SAMPLES);
array hist_arr = histogram(norm, BINS);
win.hist(hist_arr, 0, BINS);
히스토그램 배열 외에도 af :: Window :: hist () 함수는 히스토그램 배열에있는 모든 데이터 포인트의 최소값과 최대 값이라는 두 가지 다른 매개 변수도 허용합니다. 이것은 저장된 데이터의 범위를 효과적으로 설정합니다.
void hist(const array & X, const double minval, const double maxval, const char * const title = NULL);
5. 표면
af :: Window :: surface () 함수는 배열을 3D 표면으로 그립니다.
array Z = randu(21, 21);
window.surface(Z, "Random Surface"); //equal to next function call
//window.surface( seq(-1, 1, 0.1), seq(-1, 1, 0.1), Z, "Random Surface");
af :: Window :: surface () 함수에는 두 가지 오버로드가 있습니다.
void surface (const array & S, const char * const title ) // Accepts a 2d matrix with the z values of the surface
void surface (const array &xVals, const array &yVals, const array &S, const char * const title) // accepts additional vectors that define the x,y coordinates for the surface points.
두 번째 과부하에는 X 및 Y 좌표 벡터에 대한 두 가지 옵션이 있습니다. mxn 크기의 표면 메시를 가정합니다.
- 각 축을 따라 간격을 정의하는 벡터입니다. 벡터의 크기는 mx 1 및 nx 1입니다.
- 각 점의 좌표를 포함하는 벡터입니다. 각 벡터의 길이는 mn x 1입니다. 완전히 불균일 한 표면이나 파라 메트릭 표면에 사용할 수 있습니다.
4. 결론
ArrayFire에는 데이터를 시각화하는 매우 포괄적 인 방법이 있습니다. 고성능 GPU 드로잉 라이브러리 Forge 사용 덕분에 제공된 Arrayfire 기능은 시각화를 가능한 한 간단하게 만들뿐만 아니라 나머지 Arrayfire 라이브러리의 견고성을 유지합니다.