Избегайте циклов в Matlab при поиске индексов - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть список "граней" списка граней в форме nx 3.
Каждая строка содержит 3 индекса из 3 разных строк из списка 3 тревожных вершин.(Таким образом, каждое значение - это индекс строки, которая содержит 3 координаты вершины.

В моем векторном "индексе" в форме nx 1 я сохранил индексы вершин, которые представляют для меня интерес.

Теперь я хочу увидеть, где в моем «списке лиц» содержатся эти индексы из моего векторного «индекса».

В данный момент я перебираю свой список лиц, чтобы получить «вектор s», который имеетиндексы для строк «списка граней».
Чтобы улучшить производительность, я предварительно выделил «вектор s» с нулями.
Есть ли более быстрый способ получить тот же результат?

s = zeros(9000000,1);
aa = 0;
for a = 1:size(indices,1)
    [i,j] = find (faces == indices(a));

    s(aa+1:aa + size(i,1),1) = i;
    aa = aa + size(i,1);
end

ss = s(any(s,2),:);
faces = faces(ss(:,1),:);

Спасибо за вашу помощь. К сожалению, я не очень разбираюсь в matlab и все еще не могу векторизовать мой код.

1 Ответ

0 голосов
/ 09 декабря 2018

Ключом здесь является использование ismember.Это дает вам логический массив, равный 1, где элемент первого массива равен любому из элементов второго, в данном случае faces и indices.

В качестве игрушечного примера:

>> faces = randi(10, 10, 3)
faces =

    5    3    9
    8    4    4
   10    7   10
    6    6    3
    8   10    1
    9    2    2
    4    7    9
    5    8    3
    7    8    4
    2    4    9

>> indices = [1, 2, 3].'
indices =

   1
   2
   3    

>> s = ismember(faces, indices)
s =

  0  1  0
  0  0  0
  0  0  0
  0  0  1
  0  0  1
  0  1  1
  0  0  0
  0  0  1
  0  0  0
  1  0  0

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

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