Matlab - 在不使用额外内存的情况下切片阵列

时间:2015-01-22 11:15:35

标签: arrays matlab memory-management parallel-processing

我想将4D阵列沿着第五维切成n个部分,以便在parfor中使用它:

X(:,:,:,particles)-->X(:,:,:,particles/n,n)

问题是X太大了,如果我开始将它写入一个新变量,我的内存耗尽,所以我基本上想做:

X = cat(5,X(:,:,:,1:particles/n),X(:,:,:,particles/n+1:2*particles/n),...)

我正在用

这样做
sliced = 'cat(5'
for i=1:n
    sliced = strcat(2,sliced,sprintf(',X(:,:,:,(1+(%i-1)*%i):%i*%i)',i,particles/n,i,particles/n))
end
sliced = strcat(2,sliced,')');
X = eval(sliced);

我明白了:

Error: The input character is not valid in MATLAB statements or expressions.

如果我打印出切片的内容并对所有内容进行评论并将手动切片的打印输出粘贴到eval(' ...')就可以了。

任何人都可以解决我的问题或其他方式切片4D阵列而不使用额外的内存?

谢谢

2 个答案:

答案 0 :(得分:1)

您可以使用 reshape ,不得使用任何额外的内存 -

sz_X = size(X) %// get size
X = reshape(X,sz_X(1),sz_X(2),sz_X(3),sz_X(4)/n,[]); %// reshape and save 
              %// into same variable and as such must be memory efficient

答案 1 :(得分:0)

确定。我只是混淆了猫和strcat的东西不一样... oops:o

n           = 4;
particles   = 200;
X           = rand(6,6,6,particles);

sliced  = sprintf('X = cat(5'); 

for i = 1:n
     sliced = cat(2,sliced,sprintf(',X(:,:,:,(1+(%i-1)*%i):%i*%i)',i,particles/n,i,particles/n));
end

sliced = cat(2,sliced,sprintf(');'));
eval(sliced);

工作得很好。如果有人在没有使用内存的情况下有更好的切片方法 - 请随时发布...