Создание новой матрицы из ячейки с некоторыми пустыми ячейками без учета пустых ячеек

У меня есть в Matlab ячейка с именем: elem

 [36 29]
 []
 [30 29]
 [30 18]
 []
 [31 29]
 []
 []
 [8 9]
 [32 30]

и матрица с именем: conn

1   2
1   3
1   4
1   5
2   3
2   4
2   5
3   4
3   5
4   5

и я хочу создать 2 новые матрицы, которые будут содержать только элементы, соответствующие непустым ячейкам elem без использования цикла for. Например, правильным результатом будет:

29  36
29  30
18  30
29  31
8   9
30  32

а также:

1   2
1   4
1   5
2   4
3   5
4   5

Любая помощь будет принята с благодарностью.


person sofian7    schedule 18.03.2014    source источник


Ответы (3)


inds = ~cellfun('isempty', elem);    %// NOTE: faster than anonymous function
conn = conn(inds,:);
elem = elem(inds);                   %// (preservative)

or

inds = cellfun('isempty', elem);     %// NOTE: faster than anonymous function
conn(inds,:) = [];
elem(inds  ) = [];                   %// (destructive)

or

inds = cellfun(@(x)isequal(x,[]), elem)  %// NOTE: stricter; evaluates to false 
conn = conn(inds,:);                     %// when the 'empties' are '' or {}
elem = elem(inds);                       %// or struct([])

or

inds = cellfun(@(x)isequal(x,[]), elem)  %// "
conn(inds,:) = [];
elem(inds  ) = [];

or

inds = cellfun(@numel, elem)==2    %// NOTE: even stricter; only evaluates to 
conn = conn(inds,:);               %// true when there are exactly 2 elements 
elem = elem(inds);                 %// in the entry

or

inds = cellfun(@numel, elem)==2    %// " 
conn(inds,:) = [];
elem(inds  ) = [];

или (если вас просто интересует elem)

elem = cell2mat(elem)

or

elem = cat(1,elem{:})  %// NOTE: probably the fastest of them all
person Rody Oldenhuis    schedule 18.03.2014
comment
Спасибо за ваш вклад. Отлично работает, а также ускоряется по сравнению с циклом for. Спасибо всем остальным за их мысли. - person sofian7; 18.03.2014

Ваш первый результат может быть получен:

cellfun(@fliplr, elem(~cellfun(@isempty, elem)), 'UniformOutput', 0);

Обратите внимание, что я включил @fliplr, предполагая, что изменение порядка элементов в вашем вопросе было преднамеренным.

Ваш второй результат может быть получен:

conn(~cellfun(@isempty, elem), :);
person Shanqing Cai    schedule 18.03.2014

вы можете использовать функцию @isempty для cellfun() вместе с такими логическими операторами:

EmptyCells=cellfun(@isempty,elem); %Detect empty cells

elem(EmptyCells)=[]; %Remove empty cells

conn=conn(~EmptyCells); %Remove elements corresponding the empty cells in elem

Надеюсь, это работает!

person McMa    schedule 18.03.2014