Matlab - 在不使用额外内存的情况下切片数组
Matlab - Slicing an Array without using additional memory
我想将一个 4 维数组沿着第 5 维分成 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.
如果我打印出 sliced 的内容并注释所有内容,然后将 sliced 的打印输出手动粘贴到 eval('...') 中,它就可以工作。
有人找到了我的问题的解决方案或另一种无需使用额外内存即可对 4D 数组进行切片的方法吗?
谢谢
好的。我只是把事情弄混了 cat 和 strcat 不一样......糟糕 :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);
工作正常。如果有人有更好的切片方法而不使用内存 - 请随时 post...
可以使用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
我想将一个 4 维数组沿着第 5 维分成 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.
如果我打印出 sliced 的内容并注释所有内容,然后将 sliced 的打印输出手动粘贴到 eval('...') 中,它就可以工作。
有人找到了我的问题的解决方案或另一种无需使用额外内存即可对 4D 数组进行切片的方法吗?
谢谢
好的。我只是把事情弄混了 cat 和 strcat 不一样......糟糕 :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);
工作正常。如果有人有更好的切片方法而不使用内存 - 请随时 post...
可以使用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