ArrayFire:07配列と行列の操作を遊ぶ


目次
  • 前言
  • 一、配列及び行列操作関数
  • 1. flat( )
  • 2. flip( )
  • 3. join( )
  • 4. moddims( )
  • 5. reorder( )
  • 6. shift( )
  • 7. tile( )
  • 8. transpose( )
  • 9. array( )

  • 二、再ソート関数を組み合わせてメッシュ座標
  • を列挙する
    前言
    『ArrayFireを遊ぶ:06ベクトル化の紹介』では,ArrayFireを用いてコードをベクトル化する方法がいくつか知られているが,この編ではArrayFireの配列とマトリクス操作を引き続き学習する.
    一、配列とマトリックス操作関数
    ArrayFireはいくつかの異なる動作配列と行列の方法を提供する.これらのメソッドまたは関数には、次のものが含まれます.
    関数名
    意味
    moddims()
    データを変更せずに配列の次元数を変更
    array()
    異なる次元配列の(浅い)コピーを作成するには
    flat()
    配列を1 Dにフラット化
    flip()
    次元に沿って配列を反転
    join()
    最大4つの配列を接続
    reorder()
    配列内の次元順序の変更
    shift()
    次元に沿ってデータを移動
    tile()
    次元に沿って配列を繰り返す
    transpose()
    マトリックスてんい
    T()
    マトリックスまたはベクトルの回転(略記)
    H()
    エミ行列の転置(共役転置)
    次に、これらの関数のいくつかの例とその使い方を示します.
    1. flat( )
    この関数の役割は、配列を1次元に簡略化することです.
    	a [3 3 1 1]
    	    1.0000     4.0000     7.0000
    	    2.0000     5.0000     8.0000
    	    3.0000     6.0000     9.0000
    	    
    	flat(a) [9 1 1 1]
    	    1.0000
    	    2.0000
    	    3.0000
    	    4.0000
    	    5.0000
    	    6.0000
    	    7.0000
    	    8.0000
    	    9.0000
    

    flat()関数は、次のようにC++で呼び出すことができます.
    	array af::flat(const array& in) – C++ interface for flat() function
    

    2. flip( )
    この関数は、選択した次元に沿って配列の内容を反転させる役割を果たします.次の例では、5 x 2配列が0番目と1番目の軸に沿って反転することを示します.
    	a [5 2 1 1]
    	    1.0000     6.0000
    	    2.0000     7.0000
    	    3.0000     8.0000
    	    4.0000     9.0000
    	    5.0000    10.0000
    	    
    	flip(a, 0) [5 2 1 1]
    	    5.0000    10.0000
    	    4.0000     9.0000
    	    3.0000     8.0000
    	    2.0000     7.0000
    	    1.0000     6.0000
    	    
    	flip(a, 1) [5 2 1 1]
    	    6.0000     1.0000
    	    7.0000     2.0000
    	    8.0000     3.0000
    	    9.0000     4.0000
    	   10.0000     5.0000
    

    flip()関数は、次のようにC++で呼び出すことができます.
    	array af::flip(const array &in, const unsigned dim) – C++ interface for flip()
    

    3. join( )
    この関数の役割は、特定の次元に沿って配列を接続することです.C++は最大4つの配列を接続できますが、Cは最大10個の配列をサポートします.配列を自身に接続する方法の例を次に示します.
    	a [5 1 1 1]
    	    1.0000
    	    2.0000
    	    3.0000
    	    4.0000
    	    5.0000
    	    
    	join(0, a, a) [10 1 1 1]
    	    1.0000
    	    2.0000
    	    3.0000
    	    4.0000
    	    5.0000
    	    1.0000
    	    2.0000
    	    3.0000
    	    4.0000
    	    5.0000
    	    
    	join(1, a, a) [5 2 1 1]
    	    1.0000     1.0000
    	    2.0000     2.0000
    	    3.0000     3.0000
    	    4.0000     4.0000
    	    5.0000     5.0000
    

    join()関数はC++言語でいくつかの候補関数があります.
    	array af::join(const int dim, const array &first, const array &second) – Joins 2 arrays along a dimension
    	
    	array af::join(const int dim, const array &first, const array &second, const array &third) – Joins 3 arrays along a dimension.
    	
    	array af::join(const int dim, const array &first, const array &second, const array &third, const array &fourth) – Joins 4 arrays along a dimension
    

    4. moddims( )
    この関数の役割は、配列の次元を変更するが、配列のデータや順序を変更しないことです.この関数は、配列に関連付けられたメタデータのみを変更することに注意してください.配列の内容は変更されません.次に、8 x 1配列を2 x 4に変換し、8 x 1に戻る例を示します.
    	a [8 1 1 1]
    	    1.0000
    	    2.0000
    	    1.0000
    	    2.0000
    	    1.0000
    	    2.0000
    	    1.0000
    	    2.0000
    	    
    	af::dim4 new_dims(2, 4);
    	moddims(a, new_dims) [2 4 1 1]
    	    1.0000     1.0000     1.0000     1.0000
    	    2.0000     2.0000     2.0000     2.0000
    	    
    	moddims(a, a.elements(), 1, 1, 1) [8 1 1 1]
    	    1.0000
    	    2.0000
    	    1.0000
    	    2.0000
    	    1.0000
    	    2.0000
    	    1.0000
    	    2.0000
    

    moddims()関数はC++APIにいくつかの候補関数があります.
    	array af::moddims(const array &in, const unsigned ndims, const dim_t *const dims) – mods number of dimensions to match ndims as specidied in the array dims
    	
    	array af::moddims(const array &in, const dim4 &dims) – mods dimensions as specified by dims
    	
    	array af::moddims(const array &in, const dim_t d0, const dim_t d1=1, const dim_t d2=1, const dim_t d3=1) – mods dimensions of an array
    

    5. reorder( )
    この関数は、次元の変化に基づいてデータを交換し、配列内のデータの順序を変更する役割を果たします.配列内のデータは線形順序を維持します.
    	a [2 2 3 1]
    	    1.0000     3.0000
    	    2.0000     4.0000
    	    
    	    1.0000     3.0000
    	    2.0000     4.0000
    	    
    	    1.0000     3.0000
    	    2.0000     4.0000
    	    
    	reorder(a, 1, 0, 2) [2 2 3 1]  //equivalent to a transpose
    	    1.0000     2.0000
    	    3.0000     4.0000
    	    
    	    1.0000     2.0000
    	    3.0000     4.0000
    	    
    	    1.0000     2.0000
    	    3.0000     4.0000
    	    
    	reorder(a, 2, 0, 1) [3 2 2 1]
    	    1.0000     2.0000
    	    1.0000     2.0000
    	    1.0000     2.0000
    	    
    	    3.0000     4.0000
    	    3.0000     4.0000
    	    3.0000     4.0000
    

    reorder()関数はC++APIにいくつかの候補関数があります.
    	array af::reorder(const array &in, const unsigned x, const unsigned y=1, const unsigned z=2, const unsigned w=3) – Reorders dimensions of an array
    

    6. shift( )
    この関数は、選択した次元に沿ってバッファをループするようにデータを移動する役割を果たします.次の例を考慮します.
    	a [3 5 1 1]
    	    0.0000     0.0000     0.0000     0.0000     0.0000
    	    3.0000     4.0000     5.0000     1.0000     2.0000
    	    3.0000     4.0000     5.0000     1.0000     2.0000
    	    
    	shift(a, 0, 2 ) [3 5 1 1]
    	    0.0000     0.0000     0.0000     0.0000     0.0000
    	    1.0000     2.0000     3.0000     4.0000     5.0000
    	    1.0000     2.0000     3.0000     4.0000     5.0000
    	    
    	shift(a, -1, 2 ) [3 5 1 1]
    	    1.0000     2.0000     3.0000     4.0000     5.0000
    	    1.0000     2.0000     3.0000     4.0000     5.0000
    	    0.0000     0.0000     0.0000     0.0000     0.0000
    

    shift()関数は、次のようにC++で呼び出すことができます.
    	array af::shift(const array &in, const int x, const int y=0, const int z=0, const int w=0) – Shifts array along specified dimensions
    

    7. tile( )
    この関数の役割は、指定した次元に沿って配列を繰り返すことです.次の例では、配列の0次元と1次元を繰り返す方法を示します.
    	a [3 1 1 1]
    	    1.0000
    	    2.0000
    	    3.0000
    	    
    	// Repeat array a twice in the zeroth dimension
    	tile(a, 2) [6 1 1 1]
    	    1.0000
    	    2.0000
    	    3.0000
    	    1.0000
    	    2.0000
    	    3.0000
    	    
    	// Repeat array a twice along both the zeroth and first dimensions
    	tile(a, 2, 2) [6 2 1 1]
    	    1.0000     1.0000
    	    2.0000     2.0000
    	    3.0000     3.0000
    	    1.0000     1.0000
    	    2.0000     2.0000
    	    3.0000     3.0000
    	    
    	// Repeat array a twice along the first and three times along the second
    	// dimension.
    	af::dim4 tile_dims(1, 2, 3);
    	tile(a, tile_dims) [3 2 3 1]
    	    1.0000     1.0000
    	    2.0000     2.0000
    	    3.0000     3.0000
    	    1.0000     1.0000
    	    2.0000     2.0000
    	    3.0000     3.0000
    	    1.0000     1.0000
    	    2.0000     2.0000
    	    3.0000     3.0000
    

    tile()関数は、次のようにC++で呼び出すことができます.
    	array af::tile(const array &in, const unsigned x, const unsigned y=1, const unsigned z=1, const unsigned w=1) – Tiles array along specified dimensions
    
    	array af::tile(const array &in, const dim4 &dims) – Tile an array according to a dim4 object
    

    8. transpose( )
    この関数の役割は、標準的なマトリクス回転を実行することです.入力配列には2 D行列の次元数が必要です.
    	a [3 3 1 1]
    	    1.0000     3.0000     3.0000
    	    2.0000     1.0000     3.0000
    	    2.0000     2.0000     1.0000
    	    
    	transpose(a) [3 3 1 1]
    	    1.0000     2.0000     2.0000
    	    3.0000     1.0000     2.0000
    	    3.0000     3.0000     1.0000
    

    transpose()関数は、次のようにC++で呼び出すことができます.
    	array af::transpose(const array &in, const bool conjugate=false) – Transposes a matrix.
    	
    	void af::transposeInPlace(array &in, const bool conjugate=false) – Transposes a matrix in-place.
    	
    	__array af::T() – Transpose a matrix
    	
    	__array af::H() – Conjugate Transpose (Hermitian transpose) of a matrix
    

    次の例では、簡略版を使用する方法を示します.
        array x = randu(2, 2, f32);
        af_print(x.T());  // transpose (real)
        array c = randu(2, 2, c32);
        af_print(c.T());  // transpose (complex)
        af_print(c.H());  // Hermitian (conjugate) transpose
    

    9. array( )
    この関数は、異なる寸法マトリクスの(浅い)コピーを作成するために使用できます.要素の総数は一定に保たなければならない.この関数は,前述したmoddim()関数のパッケージである.
    二、並べ替え関数を組み合わせてメッシュ座標を列挙する
    配列再編成関数の組合せを使用すると、複雑な動作モードを数行のコードで迅速に記述できます.例えば、各軸が1〜nであるメッシュ生成(x,y)座標を考慮する.配列を埋め込むためにいくつかのループを使用するのではなく、上記の関数の小さな組み合わせを使用することができます.
    	unsigned n=3;
    	af::array xy = join(1,
    	                tile(seq(1, n), n),
    	                flat( transpose(tile(seq(1, n), 1, n)) )
    	                   );
    	xy [9 2 1 1]
    	    1.0000     1.0000
    	    2.0000     1.0000
    	    3.0000     1.0000
    	    1.0000     2.0000
    	    2.0000     2.0000
    	    3.0000     2.0000
    	    1.0000     3.0000
    	    2.0000     3.0000
    	    3.0000     3.0000