2016-06-23 4 views
2

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

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

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

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

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

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

ответ

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 
1

Как уже прокомментировал 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 
-1

В этом примере показано, как удалить данные из отдельных клеток, и как удалять целые клетки из массива клеток. Для запуска кода в этом примере, создать массив 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]` 
+0

ввода дано не то же самое, как то, что предусмотрено в этом вопросе. Вы создаете отдельные элементы как ячейки, тогда как вопрос имеет ** векторы как элементы ячейки **. Это происходит по касательной, и я не считаю, что это конструктивно отвечает на вопрос.Приносим извинения, если вы находите обиду в этом комментарии, но это не отвечает на вопрос. – rayryeng