【发布时间】:2012-03-06 05:57:51
【问题描述】:
我正在用 Matlab 编写一个模拟程序。
我最终会运行这个模拟数百次。
在每次模拟运行中,都有数百万个模拟周期。
在每个循环中,我都会计算一个非常复杂的函数,它需要 ~0.5 秒才能完成。
函数输入是一个长位数组(>1000 位)——它是一个0 和1 的数组。
我将位数组保存在0 和1 的矩阵中,并且对于它们中的每一个我只运行一次函数 - 因为我将结果保存在不同的数组(res)中并检查位数组是否在运行函数前的矩阵:
for i=1:1000000000
%pick a bit array somehow
[~,indx] = ismember(bit_array,bit_matrix,'rows');
if indx == 0
indx = length(results) + 1;
bit_matrix(indx,:) = bit_array;
res(indx) = complex_function(bit_array);
end
result = res(indx)
%do something with result
end
我有两个问题,真的:
有没有比“ismember”更有效的方法来查找矩阵中行的索引?
由于我多次运行模拟,并且我得到的位数组中有很大的重叠,我想缓存运行之间的矩阵,这样我就不会重新计算相同的函数位数组一遍又一遍。我怎么做?
【问题讨论】:
-
你如何将 bit_array 和 bit_matrix 存储在内存中?作为
logical?还是打包成其他数据类型? (每个logical值实际上存储在一个字节中,而不是一位,即使它只能采用两个可能的值。) -
bit_array 总共有多少不同的值?重叠是否足以让您将所有它们及其结果存储在内存中?或者它们中的一些是否需要卸载到磁盘?在单个模拟中是否存在跨模拟周期的重叠,或者只是跨不同的模拟? bit_arrays 在模拟中的执行顺序是否存在局部性(例如,通常只有一些低位发生变化)?
-
我没有声明任何东西,所以我想我使用的是常规 int32?
-
有 >1000 位,模拟大概可以达到所有状态,所以我不能使用内存或磁盘来保存所有结果。尽管如此,大多数状态都不会到达,有些状态会多次到达,所以我想到了使用LRU 映射——至少如果我使用 Java 或 Python 时我会这样做。此外,相同的状态可能不仅在同一次模拟运行中重复,而且在多次模拟中重复,所以我确实想将缓存保存到磁盘(或数据库??)。
标签: matlab caching simulation bitstring