ArrayFireで遊ぶ:09Forgeでの視覚化


序文

「ArrayFireで遊ぶ:08配列と行列の操作」では、ArrayFireの統合バックエンドについて学習しました。この記事では、ForgeでのArrayFireの視覚的な操作について引き続き学習します。


1.はじめに

     ArrayFireはライブラリとして、高性能、並列、GPUコンピューティングのための堅牢で使いやすいプラットフォームを提供することを目指しています。Forge(OpenGL視覚化ライブラリ)の目標は、同じ堅牢な視覚化を提供し、Arrayfireデータ構造とOpenGLの相互運用性を実現することです。
     Arrayfireは、af :: arrayを視覚化するための単純なインターフェイスとして設計されたラッパー関数を提供しますこれらの関数は、さまざまな相互運用性タスクを実行します。1つの特定の例は、GPUからホストにデータをコピーして再フォーマットしてからGPUに戻す時間を無駄にすることなく、GPUデータからGPUフレームバッファーデータ直接抽出できることです。これにより、メモリのコピーが2つ節約されます。
    視覚化はマウスで操作できます。以下の対策を講じることができます。

       -ズーム(Alt +マウスの左ボタンクリック、上下移動)-
       パン(左クリックしてドラッグ)
       -回転(マウスの右ボタン-ボールの回転を追跡)

    それでは、Forgeを使用して表示できる視覚効果の種類と、Arrayfireが2つのライブラリ間でデータを処理する方法を見てみましょう

2、ウィンドウ設定

    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()関数を使用して作成されます。ヒストグラム()の出力は、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.表面

     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()関数には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つのオプションがあります。サイズがmxnのサーフェスメッシュを想定します。

  • 各軸に沿った間隔を定義するベクトル。ベクトルのサイズはmx1とnx1です。
  • 各点の座標を含むベクトル。各ベクトルの長さはmnx1です。これは、完全に不均一な表面またはパラメトリック表面に使用できます。

4.結論

     ArrayFireには、データを視覚化するための非常に包括的なメソッドがあります。高性能GPU描画ライブラリForgeの使用のおかげで、提供されたArrayfire関数は、視覚化を可能な限り単純にするだけでなく、Arrayfireライブラリの他の部分の堅牢性も維持します。


おすすめ

転載: blog.csdn.net/weixin_42467801/article/details/113743546
おすすめ