【问题标题】:Copying array but not increasing memory use复制数组但不增加内存使用
【发布时间】: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 以恢复原始格式。如果内存使用问题,您可以使用rmfieldst 中删除ksim 字段。

标签: matlab memory struct


【解决方案1】:

我不认为这是您正在寻找的答案;但这是一种进步。

定义新数组并一一删除字段。由于似乎有三个巨大的输出,这会将内存使用峰值降低到 ~130% 而不是 200%。

for k = 1:nsim
    ksim(:,:,k) = st(k).ksim;
end
st = rmfield(st , 'ksim');
for k = 1:nsim
    Msim(:,k) = st(k).Msim;
end
st = rmfield(st , 'Msim');

等等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 2011-01-18
    • 2019-11-11
    • 1970-01-01
    • 2017-09-17
    相关资源
    最近更新 更多