是的,之前已经完成了一百万次,但该死的我想再做一次。我正在为C ++编写一个简单的Matrix库,目的是正确。我遇到过一些在数学上相当明显的东西,但对于强类型系统来说并不那么明显 - 事实上1x1矩阵只是一个数字。为了避免这种情况,我开始沿着毛茸茸的矩阵路径向下走,作为向量的组合,但也偶然发现两个向量相乘的事实可以是数字或二元组,这取决于两者的方向。
我的问题是,在强类型语言(如C ++或Java)中处理这种情况的正确方式是什么?
答案 0 :(得分:3)
一些相当明显的东西 数学,但不是那么明显 强类型系统 - 事实 1x1矩阵只是一个数字。
这是有争议的。一个铁杆数学家(我不是)可能会反对它,他会说1x1矩阵可以被视为同构(或类似的东西)到标量,但它们在概念上是不同的东西。只有在一些非正式的意义上“1x1矩阵是标量”(类似,但更强,没有虚构部分的复数“是真实的”)。
我不认为这种对应应该用强有力的语言来反映。在典型的实现(复杂或矩阵)中,我不认为它是,例如。 Java Apache Commons Math。例如,具有零虚部的复合体不是数字(来自POV类型 - 它们不能一个一个地铸造到另一个中)。
在矩阵的情况下,通信更加有争议。我们应该能够将两个大小(4x3)x(1x1)的矩阵相乘吗?如果我们将第二个视为标量,则它是有效的,但不是矩阵,因为它违反了乘法的矩阵维数限制。我相信Commons坚持这一点。
在弱类型语言(例如Matlab)中,它将是another story。
答案 1 :(得分:2)
如果您不担心SIMD优化等,那么我认为最好的方法是设置模板tensor。选择最大张量尺寸然后你可以这样做:
typedef Tensor3D< float, 4, 1, 1 > Vector4;
等等。如果正确实施,数学将适用于所有形式的“矩阵”和“矢量”。两者都是,毕竟只是张量的特殊情况。
编辑:知道模板的大小实际上非常简单。添加GetRows()等函数,您可以在实例化时返回传递给模板的值。
即
template< typename T, int rows, int cols > class Tensor2D
{
public:
int GetRows() { return rows; }
int GetCols() { return cols; }
};
答案 2 :(得分:0)
我的建议?不要担心1x1的情况,晚上睡觉。您不应该担心突然决定使用您的库将一堆数字建模为1x1 matricies并抱怨您的实现。
解决这些问题的人都不会那么愚蠢。如果你足够聪明地使用matricies,你就足够聪明,可以正确使用它们。
对于标量引入的所有排列,我要说你必须考虑它们。作为一个矩阵库用户,我希望能够将两个matricies相乘以得到另一个矩阵,一个(列或行)向量的矩阵得到一个向量结果,一个标量乘以一个矩阵来得到另一个矩阵。
如果我乘以两个向量,我可以得到一个标量(内积)或一个矩阵(外积)。你的图书馆最好把它们交给我。
这不是微不足道的。它已经被其他人“正确”完成了,但是要为自己完成它而感到荣幸。