为什么F#Powerpack中的矩阵元素和矢量类型是可变的?

时间:2013-04-11 16:31:18

标签: f# scientific-computing numerics f#-powerpack

F#经常被提升为一种功能语言,默认情况下数据是不可变的,但F#Powerpack中矩阵元素和矢量类型是可变的。这是为什么?

此外,为什么稀疏矩阵实现为不可变而不是普通矩阵?

2 个答案:

答案 0 :(得分:4)

F#中的标准数组类型('T[])也是可变的。您主要正确 - F#是一种功能性语言,其中数据不变性鼓励,但不需要。基本上,F#允许您编写可变/命令式代码和不可变/功能代码;由您来决定为特定应用程序实现代码的最佳方法。

具有可变数组和矩阵的另一个原因是性能 - 可以使用不可变类型实现非常快速的算法,但编写科学计算的用户通常只关心一件事:实现最大性能。在这种情况下,数组和矩阵应该是可变的。

答案 1 :(得分:3)

对于真正的高性能,在一个特定情况下需要可变性:假设您的代码已经过完美优化,并且您掌握了它所执行的所有内容,直到缓存(L1,L2)模式的访问程序,那么什么也没有对金属方法的打击很低。

这种情况主要发生在你有一个指定的问题保持不变20年,主要是在科学任务中。

一旦你离开这个特定的情况,99.99%的瓶颈就是由于过低的代表性(由低水平的语言引起),你无法表达最终的,真实的优化交易 - 你的问题就在眼前。

底线,对于性能,以下方法是唯一的方法(我认为):

  • 首先是高级/算法优化
  • 一旦探索了每个高级方法,低级优化

你可以看到这样做的结果:

  • 如果没有FIRST衡量影响,就不应该优化任何事情:只有在产生巨大的性能提升和/或不降低域逻辑的情况下才能进行改进。

  • 如果你的问题稳定且定义明确,你最终会达到这样的程度,你将别无选择,只能进入低级别,并使用记忆/可变性