Выведите размер матрицы n x m, 1, если сумма индексов четна, 0 в противном случае - PullRequest
2 голосов
/ 09 мая 2019

Я пытаюсь следующее как хобби, а не как домашнее задание.В Компьютерное программирование с использованием MATLAB: Дж. Майкл Фитпатрик и Акос Ледечи существует практическая проблема, которая задается следующим образом:

Напишите функцию с именем alternate, которая принимает два натуральных числа, n и m, в качестве входных аргументов (функция не должна проверять формат ввода) и возвращает одну матрицу в качестве выходного аргумента.Каждый элемент выходной матрицы n -by- m, для которого сумма его индексов четна, равен 1. Все остальные элементы равны нулю.

Предыдущая проблема была аналогичной, и янаписал очень простую функцию, которая делает то, что просит:

function A = alternate(n,m)
    A(1:n,1:m)=0;
    A(2:2:n,2:2:m)=1;
    A(1:2:n,1:2:m)=1;
end

Теперь мой вопрос, достаточно ли это хорошо?Он выводит именно то, что запрашивает, но не проверяет сумму.До сих пор мы не обсуждали вложенные операторы if или что-то в этом роде, мы просто начали изучать очень простые функции.Я чувствую, что расширение функциональности позволило бы переработать его лучше для будущего использования.

Ответы [ 3 ]

4 голосов
/ 09 мая 2019

Приятно видеть, что вы изучаете, шаг 1 в изучении любого языка программирования должен гарантировать, что вы всегда добавляете соответствующие комментарии! Это поможет вам и всем, кто читает ваш код. Итак, первое улучшение будет следующим:

function A = alternate(n,m)
% Function to return an n*m matrix, which is 1 when the sum of the indices is even
    A(1:n,1:m)=0;      % Create the n*m array of zeros
    A(2:2:n,2:2:m)=1;  % All elements with even row and col indices: even+even=even
    A(1:2:n,1:2:m)=1;  % All elements with odd row and col indicies: odd+odd=even
end

Однако вы можете сделать это более кратким (не обращая внимания на комментарии) и, возможно, более четко относиться к краткому изложению:

function A = alternate(n,m)
% Function to return an n*m matrix, which is 1 when the sum of the indices is even
    % Sum of row and col indices. Uses implicit expansion (R2016b+) to form 
    % a matrix from a row and column array
    idx = (1:n).' + (1:m); 
    % We want 1 when x is even, 0 when odd. mod(x,2) is the opposite, so 1-mod(x,2) works:
    A = 1 - mod( idx, 2 );
end

Обе функции выполняют одно и то же, и вам следует использовать личные предпочтения (и производительность, связанные с большими проблемами).

Я бы сказал, что даже без комментариев альтернатива, которую я написал, более четко выполняет то, что написано на банке. Вам не нужно знать краткое изложение, чтобы понять, что вы ищете четные индексные суммы, так как я выполнил суммирование и проверил четность. Ваш код требует интерпретации.

Он также может быть записан как однострочный, тогда как подход к индексированию не может быть (как вы это сделали).

A = 1 - mod( (1:n).' + (1:m), 2 ); % 1 when row + column index is even
2 голосов
/ 09 мая 2019

Ваша функция работает нормально и выдает желаемый результат, позвольте мне предложить вам альтернативу:

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 ;
0 голосов
/ 09 мая 2019

Мне не нравится портить обучение. Итак, позвольте мне дать вам несколько советов.

Matlab очень эффективен, если вы выполняете операции над векторами, а не над отдельными элементами. Итак, почему бы не создать две матрицы (например, N, M), которые содержат все индексы? Посмотрите на функцию meshgrid(). Чем вы сможете найти все позиции с четной суммой индексов в одной строке.

Второй намек на то, что на выходах логической операции, например, B = A==4, дает логическую матрицу. Вы можете преобразовать это в матрицу нулей, используя B = double(B).

Веселись!

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