MATLAB: `vertcat` в обратном порядке (2D в 3D) - PullRequest
1 голос
/ 04 июля 2019

Я ищу эффективный способ разбить огромную 2D матрицу на несколько блоков и перенести эти блоки в 3-е измерение.

Взять mat_orig (100x10).После каждых 20 рядов мне нужно сделать разрез и поместить полученный блок в 3-е измерение.То есть моя 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.)

1 Ответ

2 голосов
/ 04 июля 2019

Вы можете избежать cell2mat:

N = 20; % number of rows per block
mat_split = permute(reshape(mat_orig, N, [], size(mat_orig,2)), [1 3 2]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...