我在MATLAB中整合了一个假设树类型的算法,并且由于内存问题,它正在变得非常缓慢。分析器显示所有时间都花在写入数组上。
该算法在结构数组中保留一系列假设,并提供有关它们的信息。这个问题与假设中的3D数组(不大)有关:
H(x).someInfo(a,b,c)
每次迭代都会丢弃一些假设:
H = H(keepIndices);
剩下的那些被扩展和更新:
Hin = H;
H(N*length(H)) = H(1); % Pre-alloc?
count = 0;
for x = 1:length(Hin)
for y = 1:N
count = count + 1;
H(count) = Hin(x);
... % Computations
H(count).someInfo(:,:,a) = M; % Much time spent here
end
end
分析器表示只需花费大量时间进行写入(注释注释)。 “someInfo”是预先分配的,所以它本身并不是动态增长的,但它正在被复制。
任何人都可以建议一种方法来实现这种类型的功能,而不会在MATLAB处理内存的方式中使用低效率的交叉路径吗?不要责怪MATLAB,但它的灵活性使其比C ++更难。
答案 0 :(得分:1)
如果> tab
a b c
[1,] 1 0 0
[2,] 1 1 1
[3,] 1 0 1
[4,] 0 1 1
[5,] 0 0 0
[6,] 0 1 0
的访问模式始终相同,则可以将其转换为2D矩阵的单元格数组。你会发现
someInfo
比
快H(count).someInfo{a} = M;
因为没有复制数组数据,所以只有对数据的引用。
...如果是这种情况,您可能想要
H(count).someInfo(:,:,a) = M;
请注意,索引级别越少(你有3个!),它就越快。