Управлять значениями в массиве ячеек Matlab - PullRequest
0 голосов
/ 19 апреля 2020

Предположим, у меня есть массив ячеек 3x1 с именем subj, который имеет следующие элементы:

cell 1: 300x20 double
cell 2: 300x15 double
cell 3: 300X18 double

Я хочу удалить строки последней четверти из каждого элемента в каждой ячейке следующим образом:

subj{1}(length(subj{1})*0.25+1:end,:) = []
subj{2}(length(subj{2})*0.25+1:end,:) = []
subj{3}(length(subj{3})*0.25+1:end,:) = []

Однако я хочу сделать это в одну строку и не могу найти способ сделать это в Matlab. Я возился с преобразованием массива ячеек в матрицу, но так как там разное количество столбцов, это делает его немного более сложным. Есть ли векторизованный способ сделать это в одну строку? Я буду применять алгоритмы машинного обучения к каждому элементу subj, и было бы здорово, чтобы это было векторизовано для последующих частей моего кода.

1 Ответ

0 голосов
/ 20 апреля 2020

Лучше не назначать пустые массивы матрице (на самом деле это не работает), но переназначать саму матрицу:

% loop over the cell array
for i = 1:length(subj)
   % determine the index/number of rows. Don't forget to round as MATLAB requires integers for slicing!
   idx = round( length(subj{i})*0.25 );
   % get the new matrix
   NewMat = subj{i}(1:idx,:);
   % assign new matrix to the old address, i.e. the content of the cell
   subj{i} = NewMat;
end

MATLAB выделяет непрерывную память для матриц, поэтому обрезка не должна вызывать больших накладных расходов , В частности, не так, как он использует «ленивое копирование» и; следовательно, копирует матрицу только при изменении любого из ее значений.

...