D中线性代数包的固定维度专业化

时间:2013-01-09 21:03:41

标签: d linear-algebra

D可以专门化常量参数上的函数(在编译时已知),如果pow(base, exponent)是一个常量整数,通常用于exponent。由于C ++缺少此功能,因此它必须采用模板特化 - 黑客来掩盖API,例如Boost.Units中的pow函数模板。

但是,无法在线性代数包中使用常量参数专门化来专门化矩阵运算,例如2x2,3x3,3x3,4x3和4x4等固定维度情况下的矩阵向量乘法三维图形。这些重载通常使用SIMD指令(内在函数)实现,如果这些实现可以由这样的库自动选择适合固定大小的矩阵和向量,那将是很棒的。

我相信这对D来说是一个真正的杀手级应用,特别是在科学可视化方面。这是因为高级/动态维度线性代数和固定维度2-D / 3-D之间的桥梁可以使开发人员完全透明,使用实现这些想法的包。

已经有几个很好的用于D的2维,3维和4维线性代数包,例如gl3n。 我很乐意看到它被扩展为提供C ++库中包含的函数,如Eigen和Armadillo。

1 个答案:

答案 0 :(得分:1)

  

但是,不能在线性代数包中使用常量参数专门化来专门化矩阵运算,例如2x / 3x图形中通常使用的2x2,3x3,3x3,4x3和4x4等固定维度情况的矩阵向量乘法

是的,这完全可能,而且非常简单。有几种方法可以做到:

  • 使用模板专业化。
  • 使用模板功能约束。
  • 使用static if

以下是使用static if添加矢量的示例。

Vec!N add(int N)(Vec!N a, Vec!N b)
{
    static if (N == 4)
    {
        // Use vector ops
    }
    else
    {
        // Use generic routine
    }
}

static if在编译时进行评估,因此在运行时没有分支成本。