我必须对参数分析中的数据进行后处理,该分析将输出作为输出的1D阵列.我想将这个一维数组重新整形为一个多维矩阵,它具有我调查参数的维数(按正确的顺序排列),这些维度的数量可能不同.
我可以想出一个基于for循环的函数,但问题是,对于非常大的数组,我用完了RAM.我完全清楚这不是最聪明的方法.我想知道是否有一种更聪明的方法可以操作如此大的数组并完成与我的函数相同的工作.
function [Tensor, n_dimensions]=reshape_array(Data,ndim) n_dimensions=length(ndim); n_elements=prod(ndim); reshape_string=[]; for i=n_dimensions:-1:1 if i==1 reshape_string=strcat(reshape_string, ' ndim(', num2str(i) , ')])'); elseif i== n_dimensions reshape_string=strcat(reshape_string, ' [ndim(', num2str(i) , ')'); else reshape_string=strcat(reshape_string, ' ndim(', num2str(i) , ') '); end end invert_string=[]; for i=1:n_dimensions if i==1 invert_string=strcat(invert_string, 'ndim(', num2str(i) , '),'); elseif i== n_dimensions invert_string=strcat(invert_string, ' ndim(', num2str(i) , ')'); else invert_string=strcat(invert_string, ' ndim(', num2str(i) , '),'); end end reshape_statement=strcat('reshape(Data,',reshape_string); invert_statement=strcat('zeros(',invert_string,');'); Tens1=eval(reshape_statement); Tens2=eval(invert_statement); nLoops=length(ndim); str = ''; str_dim_tens=''; str_dim_indeces=''; for i=1:nLoops str = strcat(sprintf('%s \n for i%d=1:',str,i), sprintf('%d',ndim(i))); if i举个例子,
ndim=[2 3]; Data=1:2*3 [Tensor, n_dimensions]=reshape_array(Data,ndim); n_dimensions = 2 Tensor = 1 2 3 4 5 6我将使用更多维度(例如最小4)和具有数百万个元素的数据阵列.一个例子可能是M(10,10,10,300000)这就是为什么我在寻找计算成本最低的方法来完成这项工作.
谢谢您的帮助!
1> Luis Mendo..:从您的代码中,您希望使用与Matlab的列主要默认值相反的维度顺序来填充重新整形数组中的元素; 也就是说,你从最后一个维度开始,然后是最后一个维度,等等.
这可以通过重新形成具有相反尺寸(使用
reshape
)的尺寸的数组并且反转尺寸的顺序(使用permute
)来完成.n_dimensions = numel(ndim); Tensor = reshape(Data, ndim(end:-1:1)); % reshape with dimensions in reverse order Tensor = permute(Tensor, n_dimensions:-1:1); % reverse back order of dimensions