Удаление элементов из массива ячеек в MATLAB



У меня есть массив ячеек, как показано ниже:



a = {[1 2 3] [5 3 6] [9 1 3]};


Теперь я хочу удалить 1s из каждого массива в a, который содержит 1 , чтобы выход был таким, как показано



a = {[2 3] [5 3 6] [9 3]};


Я знаю индексы массивов в ячейке array 'a', которые содержат 1. Это можно сделать с помощью цикла for и временной переменной, но это занимает много времени (я хочу выполнить операцию с массивом ячеек размером примерно 1x100000. Тот, что выше, просто для примера)



Я хочу знать, есть ли там это любой прямой метод, который может сделать это быстро.

1514   3  

3 ответов:

Почти все будет медленно с таким большим массивом ячеек. Вы можете попробовать сделать это с помощью cellfun, но это не обязательно будет быстрее, чем цикл for.

a = cellfun(@(x)x(x ~= 1), a, 'UniformOutput', false);

%   a{1} =
%        2     3
%   a{2} =
%        5     3     6
%   a{3} =
%        9     3

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

for ii = 1 : numel(a)
    a{ii} = a{ii}(a{ii} ~= 1);
end

Это может быть быстрее, так как он не подвергается накладным расходам cellfun. Приведенный выше код обращается к вектору в каждой ячейке и извлекает те значения, которые не равны 1, и перезаписывает соответствующую ячейку с этим новым вектором.

Используя Ваш пример:

a = {[1 2 3] [5 3 6] [9 1 3]};

Получаем:

>> format compact; celldisp(a)
a{1} =
     2     3
a{2} =
     5     3     6
a{3} =
     9     3

В этом примере показано, как удалить данные из отдельных ячеек и как удалить целые ячейки из массива ячеек. Чтобы выполнить код в этом примере, создайте массив ячеек размером 3 на 3:

C = {1, 2, 3; 4, 5, 6; 7, 8, 9};

Удаление содержимого определенной ячейки путем присвоения ячейке пустого массива, используя фигурные скобки для индексации содержимого, {}:

C{2,2} = []

Этот код возвращает

C = 
    [1]    [2]    [3]
    [4]     []    [6]
    [7]    [8]    [9]

Удаление наборов ячеек с помощью стандартного индексирования массива с гладкими скобками, (). Например, это команда

C(2,:) = []

Удаляет вторую строку C:

`

C = 
    [1]    [2]    [3]
    [7]    [8]    [9]`

Comments

    Ничего не найдено.