在多维子集上插值的艺术(c ++)

时间:2016-06-14 14:11:10

标签: c++ performance function interpolation

我一直在寻找这个问题的答案,但我无法找到答案。

问题:

我有一个n维(例如n = 9)函数,这在计算上非常繁琐,但我需要进行大量的评估。我想在这种情况下使用插值。

然而k < n维(例如k = 7)是离散的(主要是二进制的),因此我需要来对这些进行内插,这使我得到m维(例如2),我想要插入它。我最感兴趣的是基本线性插值,类似于http://rncarpio.github.io/linterp/

问题:

选项A )我应该调用d1 x d2 x ... x dk插值函数(例如2 ^ 7 = 128),然后只插入我需要的两个维度,但我需要每当我需要一个值时,寻找正确的插值函数,......

...(选项B )或者我应该调用一个插值函数,它可以在所有维度之间进行插值,但是我只会用它来插入我需要的两个维度(对于所有维度)其他我完全为网格提供了函数值)?

我认为重要的是要强调我对线性插值非常感兴趣,并且答案很可能在其他情况下有所不同。此外,在我想要使用它的应用程序中,我不需要128个函数,而是需要超过10,000个函数。

此外,如果选项A是答案,我应该如何将插值函数存储在c ++中,即我应该使用带元组的映射作为键(在boost库上绘图),还是使用多维数组(再次,绘图)在升级库上)或者有更简单的方法吗?

1 个答案:

答案 0 :(得分:0)

我可能会选择选项A,但不会选择地图。如果您有二进制数据,只需使用大小为2的数组(这是使用数组时极少数情况之一);如果你有一个小域考虑有两个向量,一个用于键,一个用于值。这是因为至少在x86 / x64架构上,矢量搜索可以非常高效。请务必通过提供访问器功能(即const value& T::lookup(const key&))来隐藏此实现细节。我投票反对使用元组作为地图键,因为它使它既慢又复杂。如果您需要进行极大优化并且您的域非常小以至于其基数的乘积适合64位,您可以手动创建索引键(例如:(1&lt;&lt; 3)* key4bits +(1&lt;&lt;&lt; )* keyBinary + key2bits),在这种情况下,你将使用一个地图(或两个向量)。