Matlab 复制阵列但不增加内存使用

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

这是一个奇怪的问题,但希望有人能帮助我。 我有一个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 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
字段。