【问题标题】:cross product of two vectors(rows) in postgresqlpostgresql中两个向量(行)的叉积
【发布时间】:2014-09-01 20:32:58
【问题描述】:

我试图在 postgresql 中计算两个向量的叉积。 插图: 输入:

edgex edgey edgez
6.80837996699847 39.4163159399759 0
0 0 12

使用查询在postgresql中对这两行(向量)进行交叉乘积

【问题讨论】:

  • 您尝试了哪些方法,哪些方法不起作用?叉积的基本思想是(a2b3 - a3b2, a3b1 - a1b3, a1b2 - a2b1),在 SQL 中计算起来相当简单
  • 是的,.. 但我想在 postgresql 中尝试.. 它是按行而不是按列
  • PostgreSQL 中没有 3d 点/向量的直接类型。 point postgresql.org/docs/current/static/functions-geometry.html 是 2d,cube(贡献模块)postgresql.org/docs/current/static/cube.html 使用 n 维(但不将其解释为向量):两者都缺少计算任何类型向量积的函数/运算符。你需要使用它的公式。
  • 家庭作业/考试题?
  • @JohnBarça 我明白了,它是在c++ 中实现的,但不确定它是否可以在SQL 级别上调用,尽管postgis.net/docs/doxygen/2.2/d2/ddd/…

标签: postgresql postgis pgadmin


【解决方案1】:

为它创建一个函数。假设这些是 3D 点 PostGIS 几何:

CREATE OR REPLACE FUNCTION ST_CrossProduct(point_a geometry, point_b geometry)
  RETURNS geometry AS
$BODY$SELECT ST_SetSRID(ST_MakePoint(
  a2 * b3 - a3 * b2,
  a3 * b1 - a1 * b3,
  a1 * b2 - a2 * b1), ST_SRID($1))
FROM (SELECT
  ST_X($1) AS a1, ST_Y($1) AS a2, COALESCE(ST_Z($1), 0.0) AS a3,
  ST_X($2) AS b1, ST_Y($2) AS b2, COALESCE(ST_Z($2), 0.0) AS b3
) AS f$BODY$
LANGUAGE sql IMMUTABLE;

使用它:

SELECT ST_AsText(ST_CrossProduct(
     ST_MakePoint(6.80837996699847, 39.4163159399759, 0),
     ST_MakePoint(0, 0, 12)));

                   st_astext                    
------------------------------------------------
 POINT Z (472.995791279711 -81.7005596039816 0)
(1 row)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 2015-12-27
    • 2017-04-01
    • 1970-01-01
    相关资源
    最近更新 更多