Mathematica大表周期内插
我在Mathematica中有一个很大的表((dimcub-1)^ 3个元素)来自逆FFT。我需要在此表上使用定期插值。由于周期性插值要求第一个元素和最后一个元素相等,因此我手动创建了一个新的dim_3元素表,并将其用于我的插值。它可以工作,但是很丑/很慢,由于我多余的中间表,我很快就遇到了内存障碍。谁能告诉我如何通过附加元素将旧表转换为周期表,或者使用我的非周期表创建周期插值函数?这是我当前的代码:
mr 1
是新表:
mr1 = Table[ 0. , {i, 1, dimcub}, {j, 1, dimcub}, {k, 1, dimcub}];
Do[Do[ Do[
mr1[[m, n, k]] = oldtable[[m, n, k]] ; , {m, 1,
dimcub - 1}]; , {n, 1, dimcub - 1}]; , {k, 1, dimcub - 1}];
Do[Do[ mr1[[m, n, dimcub]] = mr1[[m, n, 1]];
mr1[[m, dimcub, n]] = mr1[[m, 1, n]];
mr1[[dimcub, m, n]] = mr1[[1, m, n]]; , {m, 1, dimcub - 1}];
mr1[[n, dimcub, dimcub]] = mr1[[n, 1, 1]];
mr1[[dimcub, n, dimcub]] = mr1[[1, n, 1]];
mr1[[dimcub, dimcub, n]] = mr1[[1, 1, n]]; , {n, 1, dimcub - 1}];
mr1[[dimcub, dimcub, dimcub]] = mr1[[1, 1, 1]];
Remove[oldtable];
myinterpolatingfunction =
ListInterpolation[mr1, {{1, dimcub}, {1, dimcub}, {1, dimcub}},
InterpolationOrder -> 1,
PeriodicInterpolation -> True];
Remove[mr1];
myinterpolatingfunction
占用的内存少得多,并且一旦我删除了旧表就可以完美工作。任何帮助将不胜感激。
没有找到相关结果
已邀请:
4 个回复
碧肮械淌设
下图说明了Leonid所做的事情。他的代码的第4-6行执行左侧面板中所示的操作:复制已复制的平面(浅色)的一行(较暗的颜色)。第7行由右侧面板显示。这是对角相对位置的单元到单元复制,并且其操作未单独包含在前三个复制动作中的任何一个中,而是其连续操作的结果。
芦歉竭皑
这些分配取代了嵌套循环,并且速度更快,而且您不需要内存来存储副本。这基于Part命令的扩展矢量化功能(数组和通用表达式索引),尤其是矢量化分配。将数字数组设置为打包数组的形式也很重要,这是常见的情况。
系漏
瞥同忙接
向导的答案对于我的数学水平来说太高了。