【发布时间】:2016-12-23 04:46:30
【问题描述】:
这是一个奇怪的问题,但希望有人能够帮助我。 我有一个 matlab 代码,由于代码的并行化性质,我需要使用结构数组。
运行 parfor 循环后,我想将这些结构数组转换为三维数组。
目前我正在使用以下代码:
for k = 1:nsim
ksim(:,:,k) = st(k).ksim;
Msim(:,k) = st(k).Msim;
Vsim(:,:,k) = st(k).Vsim;
Psim(:,:,k) = st(k).Psim;
end
clearvars st
然而,这似乎效率极低,因为 matlab 需要将所有矩阵加倍,因此内存使用量也会加倍。 有什么更聪明的方法可以在不增加那么多内存使用的情况下实现这一目标?
【问题讨论】:
-
为什么不能将数据保留为结构体?
-
为什么必须使用结构?我假设您可以预先分配输出,然后将其填充到并行部分中。也许您可以分享有关该部分的详细信息。
-
如果我不使用 struct 矩阵是 3 维 A(i,j,k) ,其中 k 是平行维度。 Parfor 不能使用这些。另一方面,如果我制作 struct(k).A(i,j) 它可以完美运行。
-
@volcompt 这不是真的。
o = zeros(3,3,12); parfor x = 1:12 o(:,:,x) = (-10 * input(x)) + (20 * input(x)) * rand(3); end工作得很好。 -
您可以通过
ksim = [st(:).ksim]向量化然后reshape以恢复原始格式。如果内存使用问题,您可以使用rmfield从st中删除ksim字段。