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)
鉴于v和d, 第一列力给出了来自v。
的第(n + 1)个向量第二列力给了我们来自v。
的每个向量第3列力给了我们两个向量之间的常数。
也就是说,(1 2);(1 2)
在第3列强制上有1,但(1 2);(3 4)
可能没有。
我想制作一个monad函数给我们
force=:(v ((1{>"0 v);])@{~ ] i.4) ,"1 0 <"0>(1{d)
如果我们输入force_constant 1
或force=:(v ((2{>"0 v);])@{~ ] i.4) ,"1 0 <"0>(2{d)
如果我们输入force_constant 2
有人可以帮忙吗?
答案 0 :(得分:4)
你自己已经写了大部分内容。只需使用您使用force
编写的y
的最终版本,并将其包装在一个明确的定义中:
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 |
+---+---+----+
现在,此公式取决于全局定义的名词v
和d
。您可以考虑更改它,以便force_constant
或相关谓词将这些数组作为输入。最简单的方法是将monad更改为dyads,让v
和d
作为左参数x
¹进入。
¹但我们现在可以保持简单。如果您想获得有关代码的更多反馈,请随时在http://codereview.stackexchange.com/上发布。