【问题标题】:A better way to rotate columns of a matrix independently独立旋转矩阵列的更好方法
【发布时间】:2019-01-17 02:46:39
【问题描述】:

作为我学习 j 之旅的一部分,我实现了一种计算我在Futility Closet 中遇到的多边形面积的技术。我想出了一个解决方案,但它很不优雅,所以我对更好的方法很感兴趣:

   polyarea =: -:@((+/@((1&{&|:)*(0{&|:1&|.)))-(+/@((0&{&|:)*(1{&|:1&|.))))
   y =: 2 7 9 5 6,.5 7 1 0 4
   polyarea y
20

此技术旋转一列并获取列的点积,然后在旋转另一列后执行相同操作。面积是这两个结果之差的一半。

对建议感兴趣!

【问题讨论】:

  • 这比其他任何东西都更像是代码高尔夫。我会把polyarea 写成-:@|@(-&:((+/ .* 1&|.)/) |.)@|:。核心是rotate and dot(+/ .* 1&|.),您使用一次作为输入y,一次用于反向|.y,使用火车(f |.)。然后使用组合- &: g 减去结果。
  • 谢谢,我很喜欢。对于 j,我发现一些代码高尔夫对加深您的理解很有帮助!

标签: j


【解决方案1】:

我认为他们的技术归结为使用行列式找到多边形的面积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 并返回结果的绝对值。

   clean @: dets y
20

要以完整的默认形式查看结果,我们可以依靠 f. 副词(修复)来扁平化我们的定义。

   clean @: dets f.
|@:-:@:(+/)@:(2 -/ .*\ (, {.))

这只是看待他们在做什么的不同方式,但它允许 J 使用 . 连词(点积)和 \ 副词(中缀)来处理所有这些带有行列式的旋转。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    相关资源
    最近更新 更多