Удалить элементы в ячейках массива MATLAB

Этот пост относится к операции «удалить элементы», в которой используются пустые скобки [].

Я пытаюсь использовать [] для удаления определенных элементов внутри ячейки. В предыдущем сообщении упоминалось, что использование () вместо {} с [] для массива является подходящим синтаксисом для удаления элементов, а не всей ячейки. Однако этот синтаксис, похоже, не работает (ошибка: ()-indexing должен стоять последним в выражении индекса). Мой исходный код выглядит следующим образом: он использует {}, а не() для удаления элементов, содержащихся в каждой ячейке newinter, из соответствующей ячейки inter2.

for i=1:11
    inter2{i}(newinter{i}) = [];
end

inter2 - это массив 1X11. newinter также является массивом 1x11. Я использовал массивы вместо матриц, потому что длина каждого вектора, содержащегося в ячейках этих массивов, различна.

Заранее спасибо!


person user2642696    schedule 01.08.2013    source источник
comment
Не могли бы вы добавить небольшой пример того, как выглядят ваши данные и цель? Что-то вроде: inter2 = {[1 2 3], [1 2]} и должно стать {{[1 3], [2]}. Также вы не указываете, какую ошибку дает код примера (только какую ошибку дает альтернативный код).   -  person Dennis Jaheruddin    schedule 01.08.2013
comment
Конечно! одна ячейка в inter2 может быть: [86 56 96 14 11], а соответствующая ячейка (например, i=1) в newinter может быть [86 56]. результат, который я хочу, inter2=[96 14 11]. в этом случае я не отдаю предпочтение порядку. я просто хочу, чтобы элементы в newinter были удалены из inter2.   -  person user2642696    schedule 01.08.2013
comment
Кроме того, исходная ошибка была следующей: Индекс матрицы выходит за пределы допустимого диапазона для удаления.   -  person user2642696    schedule 01.08.2013
comment
Я думаю, вы уже нашли решение, просто чтобы уточнить: вы пытались установить 86-й и 56-й элементы равными нулю, в то время как было доступно только 5 элементов.   -  person Dennis Jaheruddin    schedule 02.08.2013


Ответы (3)


Из вашего комментария кажется, что newinter содержит не индексы, а фактические значения, однако вы используете его для индексации. Чтобы удалить элементы по значению, вы можете использовать этот код вместо этого

for i=1:11
    inter2{i}(ismember(inter2{i}, newinter{i}))=[];
end
person Mohsen Nosratinia    schedule 01.08.2013
comment
ДА! Блестящий. Я не осознавал, что использую его для индексации, а не для поиска элементов. Спасибо! - person user2642696; 01.08.2013

В данный момент я не рядом с компьютером MATLAB, но попробуйте:

for i=1:11
    inter2{i}(1,newinter{i})=[];
end

Обратите внимание: если вы пытаетесь удалить содержимое ячейки, а не саму ячейку, вы делаете это наоборот. {} обращается к содержимому ячейки, а () возвращает саму ячейку, поэтому вам следует использовать {}, если вы хотите сохранить ячейку нетронутой. См. эту ссылку для примерный случай.

person Kendra Lynne    schedule 01.08.2013
comment
Привет, спасибо за ваш ответ. Я попробовал ваш код и понял его логику. Однако я попробовал и получил следующую ошибку: Назначение содержимого ячейки объекту массива, отличному от ячейки. Итак, я попробовал () вместо {} после inter2{i} и получил еще одну ошибку: индекс матрицы выходит за пределы допустимого диапазона для удаления. Это ошибка, которую я получил в первый раз при использовании кода, отображаемого в моем исходном вопросе. - person user2642696; 01.08.2013
comment
Хорошо, и просто для ясности, каждый inter{i} — это собственный массив? - person Kendra Lynne; 01.08.2013
comment
inter2 представляет собой массив ячеек с 11 указателями ячеек, каждый из которых представляет собой вектор 1X110. хотя эти векторы имеют одинаковый размер, они окажутся разного размера, потому что newinter, еще один массив ячеек с 11 указателями ячеек, состоит из 11 векторов 1X_ разного размера, каждый из которых содержит 20 столбцов или меньше. - person user2642696; 01.08.2013
comment
Наряду с информацией, которую запрашивает комментарий в вашем вопросе, я бы добавил ее к вашему вопросу, чтобы предоставить более подробную информацию. - person Kendra Lynne; 01.08.2013

Решение с пересечением определенно подходит, если вы хотите удалить элементы с помощью [], однако, как правило, самый простой способ получить элементы из одного вектора, которых нет в другом векторе, - это setdiff.

for i=1:11
    inter2{i} = setdiff(inter2{i}, newinter{i});
end

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

person Dennis Jaheruddin    schedule 01.08.2013