Matlab 复制阵列但不增加内存使用
这是一个奇怪的问题,但希望有人能帮助我。 我有一个matlab代码,由于代码的并行性,我需要使用struct数组 在运行parfor循环之后,我想将这些结构数组转换为三维数组 目前,我正在使用以下代码:Matlab 复制阵列但不增加内存使用,matlab,memory,struct,Matlab,Memory,Struct,这是一个奇怪的问题,但希望有人能帮助我。 我有一个matlab代码,由于代码的并行性,我需要使用struct数组 在运行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 s
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暂时需要将所有矩阵加倍,因此almos将内存使用量加倍。
在不增加内存使用的情况下,有更聪明的方法吗? < P>我不认为这是你正在寻找的答案;但这是一种进步 定义新数组并逐个删除字段。由于似乎有三个巨大的输出,这将把内存使用的峰值从200%降低到约130%
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');
< P>我不认为这是你在寻找的答案;但这是一种进步 定义新数组并逐个删除字段。由于似乎有三个巨大的输出,这将把内存使用的峰值从200%降低到约130%
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');
等等。为什么不能将数据保留为结构?为什么必须使用结构?我假设您可以预先分配输出,然后将其填充到并行部分中。也许你可以分享这个部分的细节。如果我不使用struct,矩阵是三维的A(I,j,k),其中k是平行维。Parfor无法处理这些问题。另一方面,如果我使struct(k).A(I,j)完美工作。@volcompt这不是真的<代码>o=零(3,3,12);parforx=1:12o(:,:,x)=(-10*输入(x))+(20*输入(x))*rand(3);end工作正常。您可以通过
ksim=[st(:).ksim]
进行矢量化,然后重塑
以恢复原始格式。如果内存使用是一个问题,那么可以使用rmfield
从st
中删除ksim
字段。为什么不能将数据保留为结构?为什么必须使用结构?我假设您可以预先分配输出,然后将其填充到并行部分中。也许你可以分享这个部分的细节。如果我不使用struct,矩阵是三维的A(I,j,k),其中k是平行维。Parfor无法处理这些问题。另一方面,如果我使struct(k).A(I,j)完美工作。@volcompt这不是真的<代码>o=零(3,3,12);parforx=1:12o(:,:,x)=(-10*输入(x))+(20*输入(x))*rand(3);end工作正常。您可以通过ksim=[st(:).ksim]
进行矢量化,然后重塑
以恢复原始格式。如果担心内存使用,则可以使用rmfield
从st
中删除ksim
字段。