Более быстрый способ размещения элементов Matrix в векторах, отличных от цикла for - PullRequest
1 голос
/ 14 апреля 2020

Надеюсь, это встретится правильно. У меня есть 4 облака / группы точек в массиве сетки (представьте 2D-пространство с 4 отдельными кластерами, например, сетку точек 3x3), каждая точка имеет координаты X и Y. Я хотел бы написать вектор из четырех точек в виде (X1, Y1, X2, Y2, X3, Y3, X4, Y4), где число представляет каждое облако / группу. Теперь я на самом деле хотел бы написать матрицу всех комбинаций вышеуказанного вектора, охватывающую все точки, поэтому верхние левые точки во всех четырех группах в первой строке, то же самое для второй строки, но верхняя средняя точка для группы 4, et c.

Один из способов сделать это для -l oop по всей переменной, что будет означать 8 вложенных циклов (4 для каждой координаты X из 4 групп, 4 для каждого Y координата 4 группы).

Может быть, есть более быстрый путь? 4 группы 3х3 означают 6561 комбинацию. Переход к большему массиву в каждой группе, например, 11x11, будет означать 214 миллионов комбинаций.

Я пытаюсь распараллелить некоторые вычисления с использованием этих координат точек, но записываю результаты в парфоре l oop. это собственный набор вопросов, если бы я делал это по самим пунктам. С помощью матрицы комбинаций я мог бы просто записать результаты в другой матрице с тем же числом строк и записать результат n-й строки координат точек в n-ю строку результатов.

1 Ответ

0 голосов
/ 14 апреля 2020

Как я понимаю, у вас есть 4 группы по 3х3 = 9 координатных пар. Вам нужно нарисовать одну пару из каждой группы как один результат и получить все возможные такие результаты.

Таким образом, сокращая каждую из групп из 9 пар координат до таблицы поиска, индексированной с номером от 1 9, ваша проблема может быть сведена к рисованию с заменой 4 значений из набора 1:9.

Все такие комбинации довольно легко получить. permn - это одна функция, которая делает это (из File Exchange ). Но вы можете сделать это еще проще, используя ndgrid:

ind = 1:9;
[a1,a2,a3,a4] = ndgrid(ind,ind,ind,ind);
ind = [a1(:),a2(:),a3(:),a4(:)];

Каждая строка в ind - это индексы в одной из ваших сеток 3x3.

Например, если сетка 1 is:

x1 = [0.5,0.7,0.8];
y1 = [4.2,5.7,7.1];

, тогда вы можете сгенерировать пары координат следующим образом:

[x1,y1] = meshgrid(x1,y1); % meshgrid is nearly the same as ndgrid...
xy1 = [x1(:),y1(:)];

Теперь ваша комбинация k равна:

k = 563;
[xy1(ind(k,1),:), xy2(ind(k,2),:), xy3(ind(k,3),:), xy4(ind(k,4),:)]

Вы, вероятно, захотите реализовать вышеизложенное с использованием многомерных массивов, а не x1, x2, x3, et c. Добавление индексов к переменным приводит к запутанному коду, который трудно расширить. Например, для n групп вы можете написать:

n = 4;
ind = 1:9;
ind = repmat({ind},n,1);
[ind{:}] = ndgrid(ind{:});
ind = cellfun(@(m)reshape(m,[],1), ind, 'UniformOutput',false);
ind = [ind{:}];    % ind is now the same as in the block of code above

et c.

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