5

Repa配列に取り込みたい画像を生成するプログラムを書いています。私は現在次のタイプを使用しています:

data Colour = Colour Double Double Double

ピクセルを表すために、私はを配列に変換Colourする(おそらく非効率的ですが機能的な)関数を持っています:DIM1

colourToRepa :: Colour -> Array U DIM1 Double
colourToRepa (Colour r g b) = R.fromListUnboxed (Z :. (3::Int)) [r,g,b]

現在の私のプログラムの画像は、寸法[Colour]を表す値にすぎません。(Int, Int)

Array V DIM2 Colourこれを使用して簡単に構築できますが、colourToRepaこの配列を拡張する方法はありArray U DIM3 Doubleますか?

リストを使用するだけで使用できますが、Repaのマップは配列の形状を保持します(aからmapaに移動したい)。DIM2DIM3

4

2 に答える 2

6

形状はrepaのデータとは別に保存されるため、配列の範囲を変更せずに、配列をDIM1からDIM3に再形成することに注意してください。

DIM1(フラット)アレイがあります。

> let x :: Array DIM1 Double ; x = fromList (Z :. (9::Int)) [1..9]
> x
Array (Z :. 9) [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0]

その範囲は次のとおりです。

> extent x
Z :. 9

reshapeを使用すると、配列の形状を1Dから3Dに「キャスト」できます。

> let y :: Array DIM3 Double ;
      y = reshape (Z :. (3::Int) :. (3::Int) :. (1::Int)) x
> y
Array (Z :. 3 :. 3 :. 1) [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0]

そしてそのタイプは変わります:

> :t y
y :: Array DIM3 Double
于 2013-01-14T17:03:24.800 に答える
1

ディメンションを追加する方法に応じて、たとえば次のようにextendを使用することもできます。

extraDim :: Source a Double =>
            Array a (Z :. Int :. Int) Double ->
            Array D (Z :.Int :. Int :. Int) Double
extraDim a = extend (Any :. i :. All) a
               where (Z :. i :. j) = extent a
于 2013-01-16T07:42:58.453 に答える