2017-10-09 5 views
2
v=: ((1 2);(3 4);(0 5);<(2 1)) 
d =: (1,0.5,1,0.25);(0.5,1,0.75,0.25);(1,0.75,1,0);(0.75,0.25,0,1) 
force=:(v ((0{>"0 v);])@{~ ] i.4) ,"1 0 <"0>(0{d) 
force=:(v ((1{>"0 v);])@{~ ] i.4) ,"1 0 <"0>(1{d) 
force=:(v ((2{>"0 v);])@{~ ] i.4) ,"1 0 <"0>(2{d) 
force=:(v ((3{>"0 v);])@{~ ] i.4) ,"1 0 <"0>(3{d) 
force=:(v ((4{>"0 v);])@{~ ] i.4) ,"1 0 <"0>(4{d) 
force=:(v ((y{>"0 v);])@{~ ] i.4) ,"1 0 <"0>(y{d) 

Da v und d, gibt erste Kraftsäule uns (n ​​+ 1) -te Vektor von v.Definieren der Monad-Funktion?

2. Säule der Kraft uns jeden Vektor von v gibt.

3. Spalte Kraft gibt uns eine Konstante zwischen 2 Vektoren.

Das heißt, (1 2);(1 2) wird 1 auf der dritten Spalte der Kraft haben, aber (1 2);(3 4) möglicherweise nicht. Ich möchte eine Monade Funktion machen, die uns

force=:(v ((1{>"0 v);])@{~ ] i.4) ,"1 0 <"0>(1{d)

gibt, wenn wir force_constant 1

oder force=:(v ((2{>"0 v);])@{~ ] i.4) ,"1 0 <"0>(2{d)

geben, wenn wir geben force_constant 2

Könnte jemand helfen?

Antwort

4

Sie haben das meiste schon selbst geschrieben. Nehmen Sie einfach Ihre endgültige Version von force, das Sie y schrieb mit, und es in eine explizite Definition wickeln:

v =: ((1 2);(3 4);(0 5);<(2 1)) 
    d =: (1,0.5,1,0.25);(0.5,1,0.75,0.25);(1,0.75,1,0);(0.75,0.25,0,1) 

    force_constant =: monad def '(v ((y{>"0 v);])@{~ ] i.4) ,"1 0 <"0>(y{d)' 

    force_constant 1 
+---+---+----+ 
|3 4|1 2|0.5 | 
+---+---+----+ 
|3 4|3 4|1 | 
+---+---+----+ 
|3 4|0 5|0.75| 
+---+---+----+ 
|3 4|2 1|0.25| 
+---+---+----+ 

    force_constant 2 
+---+---+----+ 
|0 5|1 2|1 | 
+---+---+----+ 
|0 5|3 4|0.75| 
+---+---+----+ 
|0 5|0 5|1 | 
+---+---+----+ 
|0 5|2 1|0 | 
+---+---+----+ 

Nun, diese Formulierung hängt von den Substantiven v und d global definiert ist. Sie könnten dies ändern, damit force_constant oder verwandte Verben diese Arrays als Eingaben annehmen. Die einfachste Methode wäre, die Monaden in Dyaden zu ändern, und lassen Sie v und d als das linke Argument, x ¹.


¹ Aber wir können es einfach halten für den Moment. Wenn Sie mehr Feedback zu Ihrem Code wünschen, senden Sie ihn einfach an http://codereview.stackexchange.com/.

+1

Ich würde zweitens Dan Vorschlag Sie Code Review überprüfen. Um ein Beispiel zu geben, ist diese Version eine reine Vereinfachung des obigen Verbs, ohne stillschweigend zu untersuchen oder 'v' &' d' als Argumente zu liefern: 'force_constant =: monad def '((y {v),. V),. <"0 > y {d'' – Tikkanz

+0

@Tikkanz Ich wäre versucht, weiter zu gehen und die Boxen abzuwerfen. Machen Sie es zu einem M x N x 2 Array von ganzen Zahlen. Fügen Sie eine Dummy-Spalte ('0's) zur Entfernungsebene hinzu, um sie regelmäßig zu machen. –

Verwandte Themen