Разделите матрицу и соответствующий ей вектор на подматрицы и подвекторы в MATLAB - PullRequest
0 голосов
/ 03 мая 2019

У меня есть две матрицы X (122 x 125973) и Y (1 x 125973). Я хочу разделить таким же образом X и Y на меньшие матрицы и векторы 122 x 1024 (деление столбцов) в Matlab.

Я пробовал несколько методов (mat2cell, loop и т. Д.), Но мне кажется, что мне не хватает синтаксиса. Любая помощь?

Примечание: 125973 нельзя разделить на 1024, поэтому последняя матрица (и вектор) будут иметь размер (122 x 21)(1 x 21) соответственно). Спасибо за вашу помощь!

1 Ответ

2 голосов
/ 03 мая 2019

Поскольку ваши подматрицы не имеют одинаковый размер, вы не можете поместить их в трехмерный массив (без NaN или заполнения нулями). Таким образом, вы можете использовать cell. Для этого с помощью mat2cell необходимо указать, сколько строк исходной матрицы следует поместить в каждую отдельную запись ячейки:

X = rand(122,125973);
Y = rand(1,125973);

% your number of rows per 'block'
n = 1024;

% the number of cols per cell entry: 
colDist = [repelem(n, floor(size(X,2)/n)) rem(size(X,2),n)];
Xcell = mat2cell(X, size(X,1), colDist);
Ycell = mat2cell(Y, size(Y,1), colDist);

Здесь repelem(n, floor(size(X,2)/n)) повторяет n для количества раз, n вписывается в число столбцов X. Затем я добавляю остаток от числа столбцов в конце (rem(size(X,2),n)) этого деления к этому вектору строк colDist.

При вызове mat2cell (mat2cell(X, rowDist, colDist)) второй аргумент rowDist должен содержать количество строк в каждой ячейке, которое для каждой записи в ячейке будет равно количеству строк в X или * 1018. *.


Кроме того, вы можете использовать цикл, чтобы разделить матрицу и вектор на подматрицы и поместить их в соответствующую ячейку.

Xcell = cell(ceil(size(X,2)/n),1);
Ycell = cell(ceil(size(X,2)/n),1);

% put in the blocks of n rows
for k = 1:floor(size(X,2)/n)
    indices = n*(k-1)+1:n*k;
    Xcell{k} = X(:,indices);
    Ycell{k} = Y(:,indices);
end

% and the remainder:
Xcell{end} = X(:, indices(end)+1:end);
Ycell{end} = Y(:, indices(end)+1:end);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...