Как сделать это для цикла более эффективным? - PullRequest
0 голосов
/ 17 октября 2019

Я написал код для функции, которая находит все связанные вершины из триангулированной поверхности. Поверхность состоит из списка вершин (VL) mx 3 и списка граней (FL) nx 3 . Каждая строка VL является одной точкой (xyz).
Каждая строка FL индексирует три строки VL. Эти три точки образуют один треугольник.

function List = findVLInd(FL, StartingPoint)

  List = StartingPoint;

  for a = 1:50000
    List = [List;find(List(a,1)==FL(:,1))];
    List = [List;find(List(a,1)==FL(:,2))];
    List = [List;find(List(a,1)==FL(:,3))];

    Lz = FL(List,:);
    List = [List;Lz(:,1);Lz(:,2);Lz(:,3)];
    List = unique(List);
  end 
end

После запуска скрипта есть 50 000 номеров, которые можно использовать в качестве индексов для VL.

К сожалению, это действительно медленно. Вероятно, из-за цикла for и списка, который растет каждый цикл. Число 50000 установлено произвольно. В моем FL около 116 000 строк, но не все связаны друг с другом.

Как я могу сделать это более эффективным?

1 Ответ

0 голосов
/ 21 октября 2019

Синтаксически я бы предложил следующее:

function List = findVLInd(FL, StartingPoint)

  List = StartingPoint;

  for a = 1:50000
    List(end+1, :) = [find(List(a,1)==FL(:,1))];
                      find(List(a,1)==FL(:,2))];
                      find(List(a,1)==FL(:,3))];

    Lz = FL(List,:);
    List(end+1:end+size(Lz,1), :) = [Lz(:,1);Lz(:,2);Lz(:,3)];
    List = unique(List);
  end 
end

Это удаляет операцию переназначения List = [List; X], которая копирует содержимое списка в другую переменную, а затем удаляет его (хотя новая переменная имеет то же самоеимя как предыдущее) и заменяет его добавляющей операцией, которая намного быстрее в Matlab, но все еще медленная. Вызвав первые три строки в вашем цикле for в одном блоке, я также могу уменьшить количество таких операций.

Согласно комментариям ChrisLuengo и pacta-sunt-servanda , есть другие проблемы, которые вы, возможно, захотите решить, направленные на улучшение функциональности вашего кода.

...