6

行列のサイズと位置pが与えられます。行列をpに1、他の位置に0で埋めるにはどうすればよいですか?

Ex.: size=(3,3) p=(3,1)

[0 0 0]
[0 0 0]
[1 0 0]

私は定義しました:

type Matrix= [[Int]]
type Pos = (Int,Int)

f:: Pos->Pos->Matrix

たとえば、次のfようになります。

 [[0,0,0],[0,0,0],[1,0,0]]

開始するのに問題があります。つまり、関数の実装方法を考えていますf。誰か助けてもらえますか?

4

3 に答える 3

10

AndrewCの答えは好きですが、リスト内包表記をネストし、行と列を分離するのではなく、位置の同等性をテストするだけで、一度に実行します。

f :: Pos -> Pos -> Matrix
f (h, w) p =  [ [if (y, x) == p then 1 else 0 | x <- [1..w]]
              | y <- [1..h]]

私は、x水平方向にy伸び、垂直方向に伸びるように、ニーモニックに配置を選択しました。その中心となるのは、座標の観点から典型的な要素を定義する表現です。行が異なる場合、列の比較は行われません。replicate w 0明確さを犠牲にして、すべてゼロの行をわずかに効率的に計算するために使用できると思います。

私も書くことを検討したい

g :: Pos -> Pos -> Matrix
g (h, w) (y, x)  =   replicate (y-1) wzeros
                 ++  (replicate (x-1) 0 ++ 1 : replicate (w-x) 0)
                 :   replicate (h-y) wzeros
  where wzeros = replicate w 0

これは長くなりますが、空間的にはさらに即時になります。それはより多くの共有を維持し、おそらく少し少ない減算を行います。ただし、位置が関連する範囲外の場合、その動作は少し奇妙になります。

于 2012-10-13T20:00:20.113 に答える
5

2つのリスト内包表記でそれを行うことができます。1つは互いに内部で使用されます。

問題を2つの小さいが類似した問題に分解します。

row b lengthacross = 
   [ --some expression that's 1 if x == b and zero otherwise
         | x <- [1..lengthacross]]

どんなタイプがrowありますか?

matrix (a,b) (lendown,lenacross) = 
   [ --a row with a 1 in it or just zeros as appropriate 
        | y <- --an appropriate list
          ]

どんなタイプがmatrixありますか?

于 2012-10-12T14:45:50.993 に答える
3

それを分解します。

  1. サイズを取り、そのサイズの「行列」を与えるタイプの関数をPos -> [[Pos]]記述しますが、各要素は独自の位置にあります。

    例えばofSize (2,2) = [[(1,1), (1,2)], [(2,1), (2,2)]]

  2. (a -> b) -> [[a]] -> [[b]]と同様に機能する型の関数を記述しmapます。(手がかり:定義機能。2map回。)

次に、これらの部分を、位置の「行列」を生成することから始まる関数にアセンブルし、それを目的の結果にマップします。

于 2012-10-12T14:17:01.850 に答える