我在使用TriScatteredInterp时遇到了内存不足的问题。我有大量的数据需要插值,当我请求单点插值时,MATLAB会返回一个错误。
x = rand(600000,1)*4-2;
y = rand(600000,1)*4-2;
z = rand(600000,1)*4-2;
T=rand(600000,1)*20-2;
>> F=TriScatteredInterp(x, y, z, T)
F =
TriScatteredInterp
Properties:
X: [600000x3 double]
V: [600000x1 double]
Method: 'linear'
F(.5773,1.6473,1.3403)
Error using TriScatteredInterp/subsref
Out of memory. Type HELP MEMORY for your
options.我想知道是否有人遇到过类似的问题,或者是否有任何可能性通过拆分数据或其他方式来增强代码。
发布于 2014-04-11 17:47:34
以下是您建议的拆分数据的方法:
%% Original data
x = rand(600000,1)*4-2;
y = rand(600000,1)*4-2;
z = rand(600000,1)*4-2;
T=rand(600000,1)*20-2;
%% No data splitting
F=TriScatteredInterp(x, y, z, T);
tic
F(.5773,1.6473,1.3403)
toc
%% Split into 8 blocks
blockBorders = -2:2:2;
F = cell(8,1);
ii = 1;
for ix = 1:2
for iy = 1:2
for iz = 1:2
inBlock = (x >= blockBorders(ix)) & (x < blockBorders(ix+1)) &...
(y >= blockBorders(iy)) & (y < blockBorders(iy+1)) &...
(z >= blockBorders(iz)) & (z < blockBorders(iz+1));
F{ii} = TriScatteredInterp(x(inBlock), y(inBlock), z(inBlock), T(inBlock));
ii = ii + 1;
end
end
end
tic
p = [.5773,1.6473,1.3403];
ix = find((p(1) >= blockBorders(1:end-1)) & (p(1) < blockBorders(2:end)));
iy = find((p(2) >= blockBorders(1:end-1)) & (p(2) < blockBorders(2:end)));
iz = find((p(3) >= blockBorders(1:end-1)) & (p(3) < blockBorders(2:end)));
ii = ix*4 + iy*2 + iz - 6;
F{ii}(p(1), p(2), p(3));
toc我的机器不会重现您的内存问题,但显示了运行时差异:第一个方法为0.246633秒,第二个方法为0.141250秒。这表明正在处理的数据量较小,可能会解决您的问题。
如果数据的大小增加,您总是可以进一步拆分数据,但是要小心,您实际上是在xyz空间的较小部分上进行插值,这可能会出现问题,这取决于数据的性质。事实上,这里给出的实现也是有问题的,因为插值块之间没有重叠,所以块边界附近的点可能插值得很差。然而,这是一个开始,也是避免内存和运行时问题的一种可能方法。
https://stackoverflow.com/questions/22990650
复制相似问题