Как удалить элемент из массива матлаб

от admin

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

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

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

3 ответов:

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

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

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

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

Получаем:

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

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

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

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

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

`

Matlab: удалить элементы из массива

У меня довольно большой массив. Чтобы упростить задачу, давайте упростим ее до:

Итак, есть группа из 1 (4 элемента), 2 (2 элемента), 3 (4 элемента), 4 (2 элемента) и 5 ​​(8 элементов). Теперь я хочу сохранить только столбцы, принадлежащие группе из 3 или более элементов. Итак, это будет так:

я делал это с помощью для цикл, сканирование отдельно 1, 2, 3 и т. д., но это очень медленно с большими массивами. Спасибо за любые предложения, как сделать это более эффективно 🙂 Арт.

задан 20 сен ’12, 12:09

Можете ли вы быть уверены, что массив всегда отсортирован? Содержит ли он только целые числа? Всегда ли шаг между значениями равен 1? — Rody Oldenhuis

1) Да, массив всегда отсортирован. Но обратите внимание, что я показал только первую строку своего массива. Есть и другие значения, но они не учитываются, так как для исключения используется только эта первая строка (но, конечно, весь столбец будет удален, если критерии не выполняются). 2) В моем случае только целые числа. 3) Нет, шаг может отличаться от 1. — Art

Спасибо всем за фантастические решения, вы прекрасны! Я должен пойти и проверить их сейчас. — Art

4 ответы

Общий подход

Если ваш вектор не обязательно отсортирован, вам нужно запустить, чтобы подсчитать количество вхождений каждого элемента в векторе. У тебя есть histc только для этого:

Последняя строка выбирает элементы, которые имеют менее 3 вхождений, и удаляет их.

Подход для сгруппированного вектора

Если ваш вектор «полусортирован», то есть если похожие элементы в векторе сгруппированы вместе (как в вашем примере), вы можете немного ускорить процесс, выполнив следующие действия:

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

Просто общее замечание: разве это решение не работает, только если A состоит из целых значений? (Да, я знаю, OP не указал, может ли A также содержать нецелые числа). Тем не менее, хорошее решение в любом случае. — Х.Мюстер

@ H.Muster Спасибо, что указали на это. Я улучшил его, чтобы он работал и для нецелочисленных значений 🙂 — Эйтан Т

+1 Ваш подход работает для нецелых чисел в A, но за счет чтения A еще раз 🙂 компромисс.. — ангайнор

Вот мой двухстрочный

accumarray используется для подсчета отдельных элементов A. find извлекает те, которые соответствуют вашему критерию «3 или более элементов». Наконец, ismember сообщает вам, где они находятся в A. Обратите внимание, что A не нужно сортировать. Конечно, accumarray работает только для целочисленных значений в A.

Читать:
Windows installer как включить

Как удалить элемент из массива матлаб

Как извлечь нули в "MATLAB" - СтатьиКак извлечь нули в "MATLAB" — Статьи

Содержание

Нулевые значения в вашем массиве MATLAB (программное обеспечение для научных вычислений) могут затруднить анализ ваших данных. Статистика или обработка сигналов может генерировать бессмысленные результаты, а графики могут быть сложными для чтения, когда представлены нулевые значения. Извлеките их — удалите их из массива — вы сможете работать с полезными данными для достижения значимых результатов.

направления

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

Например, если массив называется M, присвойте ему новую переменную Mzeros. Для этого введите «Mzeros = M» (без кавычек) в командной строке «MATLAB».

Сохраните исходный массив в текстовый файл, если он понадобится вам позже, используя функцию "dlmwrite" из MATLAB. Если хранилище переменных было случайно удалено или перезаписано, вы можете перезагрузить исходные данные из текстового файла.

Например, если исходный массив хранится в переменной Mzeros, введите «dlmwrite ('Mzeros.dat', Mzeros)» для записи в Mzeros в текстовом файле с именем Mzeros.dat.

Вы можете пропустить этот шаг, если ваши данные уже сохранены в текстовом файле.

Решите, если вам нужно сохранить ваш массив того же размера и формата. Сохраняйте это таким образом, если строки и столбцы имеют определенное значение (например, каждая строка представляет различный экспериментальный тест, а каждый столбец представляет различное количество мер). Чтобы сохранить тот же размер и формат, замените каждое нулевое значение значением NaN (представляющим «не число»).

Чтобы заменить нулевые значения на NaN в массиве с именем M, введите «M (M == 0) = NaN». Обязательно введите M == 0 с двумя знаками равенства. Эта команда скажет "MATLAB" найти все элементы M, равные нулю, и заменить их на NaN.

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

Вы можете полностью удалить нулевые элементы (вместо замены их значениями NaN), если массив представляет собой простой список значений без значимых строк и столбцов. Чтобы удалить нулевые элементы в массиве с именем M, введите «M (M == 0) = []» (без кавычек). Обязательно введите M == 0 с двумя знаками равенства. Эта команда скажет "MATLAB" найти все элементы, равные нулю, и заменить их на []. [] Представляет «пустой». Замена значения на [] удалит элемент.

Если M — двумерный массив, то теперь он будет вектором столбцов, содержащим все ненулевые элементы исходного M в смысле столбцов. Например, если M был массивом из двух строк и двух столбцов:

[1 6 0 3 2 0 7 4]

Если M — это вектор (просто строка или столбец), то теперь он будет коротким вектором. Например, если M было [1 2 0 3], теперь оно будет [1 2 3].

Массив изменится в размере и формате, когда вы удалите нулевые элементы. Но если у него нет значения NaN, вы можете анализировать данные даже с помощью функций «MATLAB», которые не игнорируют эти значения.

Удаление элементов из массива структуры в MATLAB

у меня очень большой массив структуры в matlab. Предположим, для упрощения ситуации у меня есть что-то вроде:

теперь предположим, что у меня есть какое-то условие, которое приходит и заставляет меня хотеть удалить все из structure(2) (все записи в моем массиве структуры). Как это сделать?

моим решением было просто установить соответствующие поля в [] (например, structure(1).name = []; ), но это не удаляет их, это только делает они пустые. Как на самом деле удалить их полностью из массива structure? Есть ли способ?

Похожие статьи