Ваша функция работает нормально и выдает желаемый результат, позвольте мне предложить вам альтернативу:
function A = alternate(n,m)
A = zeros( n , m ) ; % pre-allocate result (all elements at 0)
[x,y] = meshgrid(1:m,1:n) ; % define a grid of indices
A(mod(x+y,2)==0) = 1 ; % modify elements of "A" whose indices verify the condition
end
Что возвращает:
>> alternate(4,5)
ans =
1 0 1 0 1
0 1 0 1 0
1 0 1 0 1
0 1 0 1 0
инициализация:
Первая строка эквивалентна вашей первой строке, но это канонический способ MATLAB для создания новой матрицы.
Используется функция нули (n, m) .
Обратите внимание, что MATLAB имеет аналогичные функции для создания и предварительного распределения матриц для различных типов, например:
ones(n,m)
Создать
матрица double
, размер [n,m]
со всеми элементами, установленными на 1
nan(n,m)
Создать
матрица double
, размер [n,m]
со всеми элементами, установленными на NaN
false(n,m)
Создать
матрица boolean
размер [n,m]
со всеми элементами, установленными на false
Существует несколько предопределенных функций построения матриц, некоторые более специализированные (например, eye
), поэтому, прежде чем пытаться сгенерировать исходную матрицу, вы можете посмотреть в документации, существует ли специализированная функция для ваш случай.
Индексы
Во второй строке генерируются 2 матрицы x
и y
, которые будут индексами A
. Используется функция meshgrid
. Например, в показанном выше случае x
и y
выглядят так:
| x = | y = |
| 1 2 3 4 5 | 1 1 1 1 1 |
| 1 2 3 4 5 | 2 2 2 2 2 |
| 1 2 3 4 5 | 3 3 3 3 3 |
| 1 2 3 4 5 | 4 4 4 4 4 |
нечетные / четные индексы
Чтобы вычислить sum
индексов, теперь в MATLAB это тривиально, просто:
>> x+y
ans =
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
5 6 7 8 9
Теперь нам просто нужно знать, какие из них даже . Для этого мы будем использовать оператор modulo
(mod
) в этой суммированной матрице:
>> mod(x+y,2)==0
ans =
1 0 1 0 1
0 1 0 1 0
1 0 1 0 1
0 1 0 1 0
Этот результат логическая матрица имеет тот же размер, что и A
, и содержит 1
, где сумма индексов является четной, а 0
в противном случае. Мы можем использовать эту логическую матрицу для изменения только элементов A
, которые удовлетворяют условию:
>> A(mod(x+y,2)==0) = 1
A =
1 0 1 0 1
0 1 0 1 0
1 0 1 0 1
0 1 0 1 0
Обратите внимание, что в этом случае логическая матрица , найденная на предыдущем шаге, была бы в порядке, поскольку значение, присваиваемое специальным индексам, равно 1
, что совпадает с числовым представлением true
для MATLAB. Если вы хотите присвоить другое значение, но с тем же условием индексов, просто замените последнее назначение:
A(mod(x+y,2)==0) = your_target_value ;