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
占用的内存少得多,并且一旦我删除了旧表就可以完美工作。任何帮助将不胜感激。     
已邀请:
        列昂尼德和维扎德的答案都做得太多。在Leonid的情况下,仅需要前三行。为了说明这一点,我将最后4个3更改为4:
In[65]:= len = 4; oldtable = 
 Partition[Partition[Range[len^3], len], len]

Out[65]= {{{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 
   16}}, {{17, 18, 19, 20}, {21, 22, 23, 24}, {25, 26, 27, 28}, {29, 
   30, 31, 32}}, {{33, 34, 35, 36}, {37, 38, 39, 40}, {41, 42, 43, 
   44}, {45, 46, 47, 48}}, {{49, 50, 51, 52}, {53, 54, 55, 56}, {57, 
   58, 59, 60}, {61, 62, 63, 64}}}

In[66]:= oldtable[[All, All, -1]] = oldtable[[All, All, 1]];
oldtable[[All, -1, All]] = oldtable[[All, 1, All]];
oldtable[[-1, All, All]] = oldtable[[1, All, All]];
oldtable[[All, -1, -1]] == oldtable[[All, 1, 1]]
oldtable[[-1, All, -1]] == oldtable[[1, All, 1]]
oldtable[[-1, -1, All]] == oldtable[[1, 1, All]]
oldtable[[-1, -1, -1]] == oldtable[[1, 1, 1]]

Out[69]= True

Out[70]= True

Out[71]= True

Out[72]= True
下图说明了Leonid所做的事情。他的代码的第4-6行执行左侧面板中所示的操作:复制已复制的平面(浅色)的一行(较暗的颜色)。第7行由右侧面板显示。这是对角相对位置的单元到单元复制,并且其操作未单独包含在前三个复制动作中的任何一个中,而是其连续操作的结果。     
        您可以通过如下修改原始表来更快,更有效地获得它:
oldtable[[All, All, -1]] = oldtable[[All, All, 1]];
oldtable[[All, -1, All]] = oldtable[[All, 1, All]];
oldtable[[-1, All, All]] = oldtable[[1, All, All]];
oldtable[[All, -1, -1]] = oldtable[[All, 1, 1]];
oldtable[[-1, All, -1]] = oldtable[[1, All, 1]];
oldtable[[-1, -1, All]] = oldtable[[1, 1, All]];
oldtable[[-1, -1, -1]] = oldtable[[1, 1, 1]];
这些分配取代了嵌套循环,并且速度更快,而且您不需要内存来存储副本。这基于Part命令的扩展矢量化功能(数组和通用表达式索引),尤其是矢量化分配。将数字数组设置为打包数组的形式也很重要,这是常见的情况。     
        仅仅因为我有点懒,列昂尼德的解决方案可以写成:
a = {0, 1}~Tuples~3~SortBy~Tr // Rest;

MapThread[
  (oldtable[[Sequence @@ #]] = oldtable[[Sequence @@ #2]]) &,
  {-a, a} /. 0 -> All
];
    
        感谢所有的答案。我尝试了leonid的建议,但是当我打印旧表时,它仍然是(dimcub -1)^ 3维。定义了新元素,我可以单独看到它们,但是当我打印整个表时,它们不会显示在旧表中。因此,我最终得到了一些类似的东西,完全可以满足我的需求:
oldtable= PadRight[oldtable, {dimcub, dimcub, dimcub}];
oldtable[[All, All, dimcub]] = oldtable[[All, All, 1]];
oldtable[[All, dimcub, All]] = oldtable[[All, 1, All]];
oldtable[[dimcub, All, All]] = oldtable[[1, All, All]];
oldtable[[All, dimcub, dimcub]] = oldtable[[All, 1, 1]];
oldtable[[dimcub, All, dimcub]] = oldtable[[1, All, 1]];
oldtable[[dimcub, dimcub, All]] = oldtable[[1, 1, All]];
oldtable[[dimcub, dimcub, dimcub]] = oldtable[[1, 1, 1]];
向导的答案对于我的数学水平来说太高了。     

要回复问题请先登录注册