Заменить 0 из функции мод делителем - PullRequest
0 голосов
/ 19 сентября 2018
if mod(m,18) == 0
   mm = 18;
else
   mm = mod(m,18);
end

Как я могу выполнить это в одной строке, просто используя функцию mod и некоторую арифметику?Вышеупомянутый код выполняется внутри цикла for, а m является итератором.

Результат должен быть:

1 -> 1
2 -> 2
.
.
.
17 -> 17
18 -> 18
19 -> 1
20 -> 2
.
.
36 -> 18
37 -> 1
.

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Попробуйте это:

mm = mod(m,18);
mm(mm==0)=18;
0 голосов
/ 19 сентября 2018

mod имеет поддержку массивов, поэтому вам не нужен цикл:

data = 1:n;
tmp = mod(data,18);
tmp(tmp==0) = 18; % Set all numbers divisible by 18 to 18
% tmp(tmp==0) = 18*(1:floor(n/18)); % Set all numbers divisible by 18 to their original

Решение rahnema1, предоставленное в комментариях , действительно работает лучше,Я просто хочу показать, что в случае, если вы хотите, чтобы кратные числа 18 отображались как их исходное значение вместо 18, это также легко сделать с помощью этого кода:

mm=mod(m-1,18)+1
mm(mm==18) = 18*(1:floor(n/18));

Другой способ создать то же самоемассив должен использовать repmat вместо mod:

N=100; % total array length
n=18; %
m=1:n;
mm=repmat(m,[1 ceil(N/n)]);
mm=mm(1:N); % chop off remainer
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...