独立旋转矩阵列的更好方法
A better way to rotate columns of a matrix independently
作为学习 j 之旅的一部分,我实现了一种计算多边形面积的技术,这是我在 Futility Closet 中遇到的。我想出了一个解决方案,但它很不优雅,所以我对更好的方法感兴趣:
polyarea =: -:@((+/@((1&{&|:)*(0{&|:1&|.)))-(+/@((0&{&|:)*(1{&|:1&|.))))
y =: 2 7 9 5 6,.5 7 1 0 4
polyarea y
20
此技术旋转一列并取列的点积,然后在旋转另一列后执行相同操作。面积是这两个结果差的一半。
对建议感兴趣!
我认为他们的技术归结为使用行列式来求多边形的面积http://mathworld.wolfram.com/PolygonArea.html
但是使用 Futility Closet 技术,我会首先通过将第一个点添加到末尾来关闭多边形。
y =: 2 7 9 5 6,.5 7 1 0 4
close=: (, {.)
close
是一个钩子,它获取第一对并将其附加到末尾
然后一次取两个点的行列式,这基本上就是他们对列和旋转所做的事情
dets=: 2 (-/ . *)\ close
dets
取每对点的行列式 - 如果点按顺时针顺序排列,结果为负
然后采用这些值并处理答案。
clean=: |@:-:@:(+/)
clean
对行列式求和,除以 2 returns 结果的绝对值。
clean @: dets y
20
要以完整的默认形式查看结果,我们可以依靠 f.
副词(修复)来扁平化我们的定义。
clean @: dets f.
|@:-:@:(+/)@:(2 -/ .*\ (, {.))
这只是看待他们在做什么的不同方式,但它允许 J 使用 .
连词(点积)和 \
副词(中缀)来处理所有那些带有行列式的旋转。
希望对您有所帮助。
作为学习 j 之旅的一部分,我实现了一种计算多边形面积的技术,这是我在 Futility Closet 中遇到的。我想出了一个解决方案,但它很不优雅,所以我对更好的方法感兴趣:
polyarea =: -:@((+/@((1&{&|:)*(0{&|:1&|.)))-(+/@((0&{&|:)*(1{&|:1&|.))))
y =: 2 7 9 5 6,.5 7 1 0 4
polyarea y
20
此技术旋转一列并取列的点积,然后在旋转另一列后执行相同操作。面积是这两个结果差的一半。
对建议感兴趣!
我认为他们的技术归结为使用行列式来求多边形的面积http://mathworld.wolfram.com/PolygonArea.html
但是使用 Futility Closet 技术,我会首先通过将第一个点添加到末尾来关闭多边形。
y =: 2 7 9 5 6,.5 7 1 0 4
close=: (, {.)
close
是一个钩子,它获取第一对并将其附加到末尾
然后一次取两个点的行列式,这基本上就是他们对列和旋转所做的事情
dets=: 2 (-/ . *)\ close
dets
取每对点的行列式 - 如果点按顺时针顺序排列,结果为负
然后采用这些值并处理答案。
clean=: |@:-:@:(+/)
clean
对行列式求和,除以 2 returns 结果的绝对值。
clean @: dets y
20
要以完整的默认形式查看结果,我们可以依靠 f.
副词(修复)来扁平化我们的定义。
clean @: dets f.
|@:-:@:(+/)@:(2 -/ .*\ (, {.))
这只是看待他们在做什么的不同方式,但它允许 J 使用 .
连词(点积)和 \
副词(中缀)来处理所有那些带有行列式的旋转。
希望对您有所帮助。