序文
「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ライブラリの他の部分の堅牢性も維持します。