Изменить форму матрицы, разделив ее после k столбцов в MATLAB - PullRequest
0 голосов
/ 02 декабря 2018

Предположим, что у меня есть матрица, назовем ее A следующим образом:

1 2 3 4 5 1 2 3 4 5
0 2 4 6 8 1 3 5 7 9

И я хочу преобразовать ее в матрицу, например:

1 2 3 4 5
0 2 4 6 8
1 2 3 4 5
1 3 5 7 9

Итак,По сути, я хочу, чтобы MATLAB сначала считывал блок размером (2,5), а затем разбивал оставшуюся матрицу на следующую строку, а затем повторял это и так далее, пока мы не получим что-то подобное в моем примере.

Я пытался сделать это с помощью команды MATLAB reshape несколькими способами, но мне это не удалось.Любая помощь приветствуется.В случае, если это важно, мои исходные данные больше.Это (2,1080).Спасибо.

Ответы [ 3 ]

0 голосов
/ 02 декабря 2018

Возможно, вам потребуется больше информации об индексации в документации Matlab.

Для вашего примера, легко сделать следующее

A=[1 2 3 4 5 1 2 3 4 5; 0 2 4 6 8 1 3 5 7 9]
a1=A(:,1:5); % extract all rows, and columns from 1 to 5
a2=A(:,6:end); % extract all rows, and columns from 6 to end 
B=[a1;a2] % construct a new matrix. 

Нетрудно построить какие-то циклы для извлечения остальных.

0 голосов
/ 02 декабря 2018

Вот способ, которым вы можете сделать это в одну строку, используя команды reshape и permute:

B = reshape(permute(reshape(A,2,5,[]), [1,3,2]), [], 5);

Команда reshape(A,2,5,[])преобразует вашу матрицу A в трехмерный тензор измерения 2 x 5 x nblocks, где nblocks - количество блоков в A в горизонтальном направлении.Команда permute затем меняет 2-е и 3-е измерения этого трехмерного тензора, так что он становится тензором 2 x nblocks x 5.Последняя команда reshape затем преобразует трехмерный тензор в матрицу измерения (2*nblocks) x 5.

Просмотр результатов на каждом этапе может дать вам лучшее представление о том, что происходит.

0 голосов
/ 02 декабря 2018

Я не верю, что вы можете сделать это одной командой, но, возможно, кто-то меня поправит.Если скорость не очень важна, цикл for должен работать нормально.

В качестве альтернативы вы можете получить свои результаты, изменив форму каждой строки A, а затем поместив результаты в каждую другую строку новой матрицы.Это также будет работать с вашими большими данными.

A = [1     2     3     4     5     1     2     3     4     5
     0     2     4     6     8     1     3     5     7     9];
An = zeros(numel(A)/5, 5);               % Set up new, empty matrix
An(1:2:end,:) = reshape(A(1,:), 5, [])'; % Write the first row of A to every other row of An
An(2:2:end,:) = reshape(A(2,:), 5, [])'  % Write second row of A to remaining rows

An =

 1     2     3     4     5
 0     2     4     6     8
 1     2     3     4     5
 1     3     5     7     9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...