MATLAB:`vertcat`反转(2D到3D)
我正在寻找一种有效的方法,将一个巨大的2D矩阵分割成几个块,并将这些块转换成三维 取MATLAB:`vertcat`反转(2D到3D),matlab,concatenation,Matlab,Concatenation,我正在寻找一种有效的方法,将一个巨大的2D矩阵分割成几个块,并将这些块转换成三维 取mat_orig(100x10)。每隔20行之后,我需要做一个切割,并将生成的块放入三维空间。也就是说,我的100x10矩阵必须生成20x10x5矩阵 我的解决方案包括mat2cell、permute和cell2mat。它正在工作,然而,我正在处理相当大的矩阵。我想知道是否有人觉得有挑战性,可以提供更复杂(更快)的解决方案 mat_orig = reshape(1:1000, 10, 100)'; mat_len
mat_orig
(100x10
)。每隔20行之后,我需要做一个切割,并将生成的块放入三维空间。也就是说,我的100x10
矩阵必须生成20x10x5
矩阵
我的解决方案包括mat2cell、permute和cell2mat。它正在工作,然而,我正在处理相当大的矩阵。我想知道是否有人觉得有挑战性,可以提供更复杂(更快)的解决方案
mat_orig = reshape(1:1000, 10, 100)';
mat_len = 20;
num_pages = size(mat_orig, 1) / mat_len;
tic;
mat_splitted = cell2mat(permute(mat2cell(mat_orig, ones(1, num_pages) *
size(mat_orig, 1) / num_pages, 10), [3, 2,1]));
toc (% Elapsed time is 0.108561 seconds.)
mat_orig = reshape(1:100000000, 10, 10000000)';
mat_len = 10000;
num_pages = size(mat_orig, 1) / mat_len;
tic;
mat_splitted = cell2mat(permute(mat2cell(mat_orig, ones(1, num_pages) *
size(mat_orig, 1) / num_pages, 10), [3, 2,1]));
toc (% Elapsed time is 4.361126 seconds.)
您可以避免使用
cell2mat
:
N = 20; % number of rows per block
mat_split = permute(reshape(mat_orig, N, [], size(mat_orig,2)), [1 3 2]);
在本例中,您的
mat_splitted
为10000*10*1000
——这与您所说的预期结果不符。请您更新您的示例,使其与描述相匹配,好吗?如果mat_u orig
实际上是100*10
,这将非常有用,因为在您的描述中,这比您给出的大型示例更易于可视化。。。我很感兴趣的是为什么重塑(mat_orig,20,size(mat_orig,2),[])
不起作用?你可以忽略我上面的大部分评论,我现在意识到你给出了一个简短的例子(根据描述)和一个大的例子(使计时更有效)。