Создание сетки с определенным порядком - PullRequest
0 голосов
/ 16 октября 2018

Я хочу создать сетку с двумя столбцами 20x20 (x, y) с разрешением 0,2 на конкретные заказы.Сначала я знаю, как создать сетку, каждый раз фиксируя y и заполняя x следующим образом:

 [y, x] = meshgrid(0:0.2:20);
 grid = [x(:) y(:)];

Порядок, в котором я хочу, чтобы моя сетка был следующим:

- Начиная сy = 0 и x = 0, исправьте y и увеличивайте x на 2, пока не будет достигнут конец этой линии x.

- Увеличьте y на 2 и повторите вышеописанное.

-После достижения конца сетки, (20,20), начните снова с y = 0, но x = 0.2 и увеличивайте y на 2 каждый раз, когда вы достигнете конца x.

-После заполнения всех этих строк начните выше с y = 0.2 и x = 0

Точки будут в следующем порядке

(0,0) (2,0) (4,0) ... (20,0), (0,2) (2,2) (4,2) ... (20,2), ... (0,20) (2,20) (4,20) ... (20,20), (0,2,0) (2,2,0) (4,2,0) ... (18,2,0), (0,2,2) (2,2,2)(4.2,2) ... (18,2,2), ... (0,2,20) (2,2,20) (4.2,20) ... (18,2,20) .... (0,0,2) (2,0,2) (4,0,2) ... (20,0,2), (0,2,2) (2,2,2) (4,2,2) ... (20,2,2), ...

Я знаю, что это трудно объяснить, но этот код делает трюк

  grid = [];
   for j = 0:0.2:1.8
   for i = 0:0.2:1.8
      for v = j:2:20
         for u = i:2:20
             x = [u v];
             spot = [grid;x];
         end
      end
   end
end

Также я могу сделать то же самое, но начиная с (20,20) и переходя справа налево

spot=[];
for j = 20:-0.2:18.2
   for i = 20:-0.2:18.2
      for v = j:-2:0
         for u = i:-2:0
             x = [v u];
             spot = [spot;x];
         end
      end
   end
end

Мой первый вопрос: есть ли более эффективный способ написания этого кода?

Второй вопрос: я хочу разделить эту сетку на две части.Часть 1 начинается с (0,0) и идет справа налево (как первый код выше) и заканчивается на (10,10).Часть 2 начинается с (20,20) и идет слева направо (второй код) и заканчивается на (10,10).

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

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Вот мое решение

x=0:2:20;
y = .2:2:18.2;
[X Y] = meshgrid(x);

%first sequence
seq1 = cat(3,Y ,X);
res1 = reshape(seq1, [],2);

%second sequence
[X2 Y2] = meshgrid(x,y);
seq2 = cat(3,Y2,X2);
res2 = reshape(seq2, [],2);

%third sequence
[X3 Y3] = meshgrid(y, x);  %or use the meshgrid from the previous step
seq3 = cat(3,Y3,X3);
res3 = reshape(seq3, [],2);

%Result
result = [res1;res2;res3];

И порядок, по-видимому, согласуется с тем, что было дано в вопросе.

Для второго вопроса, если порядок фиксирован, как подразумеваетсяв вопросе тогда (10,10) будет 61-м элементом двумерного массива.Следовательно:

result(1:61);  %will give array values starting from the beginning up to (10,10)

Элементы от (10,10) до конца массива могут быть вычислены аналогичным образом.

0 голосов
/ 17 октября 2018

Это решение создает ту же сетку, но порядок строк отличается от вашей сетки:

z = (0:.2:1.8) + (0:2:20).';
[x y] = ndgrid(z(z<=20));
grid2 = [x(:) y(:)];

Чтобы проверить равенство вашей сетки с текущей сеткой:

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