【问题标题】:Why is there no Matrix3x3 in the System.Numerics namespace? c#为什么 System.Numerics 命名空间中没有 Matrix3x3? C#
【发布时间】:2019-09-13 09:55:31
【问题描述】:

我正在尝试用 c# 制作一个小 GUI 库,但在对矩阵转换进行了一些研究后,我发现我需要一个 Matrix3x3 来存储 Vector2 的旋转、缩放和平移。但是在 C# System.Numerics 中只有 Matrix3x2 还是 Matrix4x4?我可以用其中一种来代替吗?如果是这样,我会怎么做?为什么标准库中没有 Matrix3x3?

我对矩阵和向量编程非常陌生,如果这是一个愚蠢的问题,我很抱歉。

提前致谢。

【问题讨论】:

  • List> 或 List
  • 您可能正在寻找 3x3 的 System.Drawing2D.Matrix。 - 还有System.Drawing.ColorMatrix,也就是5x5。 - 或者看看Math.NET
  • @Taw 我无法访问 System.Drawing2D 命名空间,我在 mac 上使用 Dotnet
  • 您确实需要将其添加到问题和标签中!
  • 抱歉这么晚了,但 Matrix3x2 不是 Matrix3x3 的原因是因为齐次坐标和线性使得第 3 列总是 (0 0 1),所以它没有被存储。那么为什么不是 Matrix4x3?当您进行 3d 投影时,最后一列会发挥作用。

标签: c# macos matrix vector


【解决方案1】:

您可以使用Matrix4x4。从单位矩阵开始,用矩阵填充左上角的 3×3 元素。

例如求解一个 3×3 方程组:

// Find the barycentric coordinates
//
// Solve for (wA,wB,wC):
// | px |   | ax bx cx | | wA |
// | py | = | ay by cy | | wB |
// | pz |   | az bz cz | | wC |

var m = new Matrix4x4(
    A.X, B.X, C.X, 0,
    A.Y, B.Y, C.Y, 0,
    A.Z, B.Z, C.Z, 0,
    0, 0, 0, 1);

if (Matrix4x4.Invert(m, out Matrix4x4 u))
{
    var w = new Vector3(
        u.M11*P.X + u.M12*P.Y + u.M13*P.Z,
        u.M21*P.X + u.M22*P.Y + u.M23*P.Z,
        u.M31*P.X + u.M32*P.Y + u.M33*P.Z);

    // ...
}

至于原因,System.Numerics 的意图必须与计算机图形相关,因为它使用了 Homogeneous Coordinates,其中 3D 向量包含 4 个元素。三个正则坐标和一个标量权重因子。计算机图形的齐次坐标数学大大简化。存在Vector3 的唯一原因是因为Vector4 应该被视为3 个元素加上一个标量的向量,因此Vector3 应该用于齐次坐标的合成和分解。这意味着并非所有 4 个元素都可以平等对待,有时您需要将向量(前三个元素)与标量值(第四个元素)分开处理。

另外System.Numerics 使用单精度float 元素,这些元素几乎从未用于科学计算,但因其速度而普遍应用于计算机图形学。希望有一天CLR 支持AVX512 会有科学家可以实际使用的双精度数值内在函数。

【讨论】:

  • 如果我只需要向量A和向量B的矩阵,C值可以设置为零吗?
  • 当然可以,但是为什么不直接使用两个Vector3 对象呢?
  • 我正在翻译一些 matlab 代码 - 其中成对的向量被添加到矩阵中并相减等
  • 我没有看到将Matrix4x4 仅用作存储的好处。如果有任何开销,则将数据输入和输出。
  • 您可以查看我的翻译尝试:github.com/Lelelo1/AHRS-CSharp
猜你喜欢
  • 2023-03-06
  • 1970-01-01
  • 2014-02-25
  • 1970-01-01
  • 1970-01-01
  • 2015-09-24
  • 2017-05-05
  • 2017-09-20
  • 2016-01-19
相关资源
最近更新 更多