Матрица, равная 1, когда строка и столбец нечетные или четные - PullRequest
1 голос
/ 14 февраля 2020

Я хочу создать матрицу, которая имеет:

  • Значение 1, если строка нечетная, а столбец нечетный
  • Значение 1, если строка четная и столбец четный
  • В противном случае значение 0.

Я хочу получить те же результаты, что и код ниже, но в выражении в одну строку (окно команд):

 N=8;
 A = zeros(N);

 for row = 1:1:length(A)
     for column = 1:1:length(A)
        if(mod(row,2) == 1 && mod(column,2) == 1)

             A(row,column*(mod(column,2) == 1)) = 1;

         elseif(mod(row,2)== 0 && mod(column,2) == 0 )

             A(row,column*(mod(column,2) == 0)) = 1;

        end
     end
  end
 disp(A)

Это ожидаемый результат:

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

Ответы [ 3 ]

1 голос
/ 14 февраля 2020

Простой подход - использовать неявное расширение сложения, отметив, что

odd+odd = even+even = 0

Итак, это ваш ответ:

A = 1 - mod( (1:N) + (1:N).', 2 );

Вы также можете сделать это с помощью toeplitz, как показано в этом Сообщение ответов MATLAB

Для квадратной матрицы с количеством строк = количество столбцов = N

A = toeplitz(mod(1:N,2));

Если число строк (M) не равно количеству столбцов (N), тогда

A = toeplitz(mod(1:M,2),mod(1:N,2))

FWIW, вы задаете конкретный c случай этого вопроса:

Как максимально быстро сгенерировать настроенную матрицу игровой доски?

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

Вы можете попробовать функцию meshgrid, чтобы сгенерировать мне sh сетки, и использовать mod, чтобы определить четное или нечетное

[x,y] = meshgrid(1:N,1:N);
A = mod(x+y+1,2);

, такое, что

>> A
A =

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

Можете ли вы взять три строки?

N=8;
A = zeros(N);
A(1:2:end, 1:2:end) = 1;
A(2:2:end, 2:2:end) = 1;

Решение в одну строку (когда N чётно):

A = repmat([1, 0; 0 1], [N/2, N/2]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...