ArrayFire:09 Forgeでのビジュアル化


目次
  • 前言
  • 一、紹介
  • 二、ウィンドウ設定
  • 三、図形描画関数
  •     1. Image
  •     2. Plot
  •     3. Plot3
  •     4. Histogram
  •     5. Surface

  • 四、結論
  • 前言
    『ArrayFire:08配列とマトリクス操作を遊ぶ』では、ArrayFireの統一バックエンドを理解しています.この編では、ForgeでのArrayFireの可視化操作を引き続き学びます.
    一、紹介
    ArrayFireはライブラリとして、高性能、パラレル、GPUコンピューティングに堅牢で使いやすいプラットフォームを提供することを目的としています.Forge--OpenGLビジュアル化ライブラリ--同じように丈夫なビジュアル化を提供し、Arrayfireデータ構造とOpenGLを相互運用できることを目標としています.Arrayfireはaf::arrayを可視化するための簡単なインタフェースとして設計されたパッケージ関数を提供する.これらの関数は、さまざまな相互運用タスクを実行します.特別な例として、GPUからホストにデータをコピーして再フォーマットしてからGPUに戻るのではなく、GPU-dataからGPU-framebufferに直接データ図面を抽出することができます.これにより、メモリコピーが2つ節約されます.可視化はマウスで操作できます.次のことができます.
    -ズーム(Alt+マウスの左クリック、上下移動)-パン(左クリック、ドラッグ)-回転(マウスの右クリック-ボールの回転を追跡)
    次に、Forgeでどのようなビジュアル効果を示すか、Arrayfireが2つのライブラリ間でデータをどのように処理するかを見てみましょう.
    二、ウィンドウの設定
    Forge関数を呼び出す前に、関連するcanvasクラスを作成する必要があります.Forme関数は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. Image
    af::Window::image()関数の役割は、階調またはカラー画像を描くことです.階調画像を描画するには、2 D配列を関数に渡す必要があります.静的ノイズの例を見てみましょう.
    	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) );
    

    注意:Formeは、ArrayFireから送信されたaf::arrayタイプを自動的に処理します.最初の例では、[0,1]の範囲の浮動小数点数画像を入力した.前の例では、配列を[0255]の範囲のシンボルレスバイト配列に変換しました.すべてのFormeプロット関数のタイプ処理属性は一致しています.
        2. Plot
    af::Window::plot()関数は配列を2 D線図に可視化します.簡単な例を見てみましょう
    	array X = seq(-af::Pi, af::Pi, 0.01);
    	array Y = sin(X);
    	window.plot(X, Y);
    

    plot関数には、次のような特徴があります.
    	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. Plot3
    af::Window::plot 3()関数には、次のような特徴があります.
    	void plot3 (const array &in, const char * title = NULL);
    

    配列を入力するには、XYZ座標を順番に入力する必要があります.これらの点は、1次元(3 nx 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. Histogram
    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()関数は、ヒストグラム配列内のすべてのデータ点の最小値と最大値の2つの他のパラメータを受け入れます.これは、データを格納する範囲を効果的に設定します.
    	void hist(const array & X, const double minval, const double maxval, const char * const title = NULL);
    

        5. Surface
    af::Window::surface()関数は配列を3 Dサーフェスに描画します.
    	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()関数には2つのリロードがあります.
    	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.
    

    2番目のリロードには、X、Y座標ベクトルの2つのオプションがあります.m x nのサイズの表面メッシュを仮定します.
  • は、各軸の間隔に沿ったベクトルを定義する.ベクトルの大きさはm x 1とn x 1である.
  • は、各点座標のベクトルを含む.各ベクトルの長さはmnx 1である.これは、完全に不均一なサーフェスまたはパラメータサーフェスに使用できます.

  • 四、結論
    ArrayFireには、データを可視化するためのかなり包括的な方法があります.高性能GPUグラフィックスライブラリForgeを使用するため、提供されるArrayfire関数は、可視化を可能な限り簡単にするだけでなく、Arrayfireライブラリの残りの部分の堅牢性を維持します.