Получить новые индексы элементов после удаления некоторых строк из матрицы - PullRequest
0 голосов
/ 02 апреля 2012

У меня есть матрица размером 10000 на 1. Я хочу удалить несколько строк, скажем, 50 из случайного положения. После удаления строк размер матрицы будет 9950. Итак, как мне получить индекс любого элемента из исходных 10000. Я имею в виду, предположим, что я хочу получить значение 9999-го элемента в качестве индекса в исходной матрице. Но теперь, так как размер моей новой матрицы составляет 9950 после удаления некоторых строк, как я могу узнать, какой 9999-й элемент из исходной матрицы? Каков наилучший способ сделать это?

Ответы [ 2 ]

2 голосов
/ 02 апреля 2012

То есть вы хотите уменьшить матрицу случайным образом, но все еще помните, откуда появился каждый элемент? И знаете, где оригинальные элементы оказались? Один из способов сделать это - сохранить индекс, который запоминает, откуда пришли элементы в сжатой матрице.

Допустим, ваша исходная матрица

A = rand(10000,1);

Индекс, который запоминает, откуда взялись эти элементы:

A_idx = [1:length(A)]';

Теперь, заимствуя у @yuk, давайте случайным образом удалим некоторые элементы:

rp_idx      = randperm(numel(A));
kill        = rp_idx(1:50);
A(kill)     = [];
A_idx(kill) = [];

Теперь, сколько бы раз вы ни выполняли эту процедуру и не удаляли элементы, исходное местоположение A(i) было A_idx(i).

И k-й элемент исходной матрицы теперь можно найти по адресу

new_idx = find( A_idx == k )

в новой уменьшенной матрице. Обратите внимание, что new_idx будет пустым, если искомый элемент является одним из тех, которые были удалены.

0 голосов
/ 02 апреля 2012

Обычно, когда у вас есть индекс элементов для удаления, вы удаляете их все одновременно.Например, давайте сгенерируем случайный индекс из 50 элементов из вектора 10000 A.

rp_idx = randperm(numel(A));
rp_idx_50 = rp(1:50);

Затем мы можем удалить эти 50 элементов как

A(rp_idx_50) = [];

Если у вас по какой-то причине естьчтобы удалить элементы один за другим, отсортируйте индекс и начните с конца.В этом случае вам не нужно искать новый индекс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...