【问题标题】:Replace 0 from mod function with the divisor用除数替换 mod 函数中的 0
【发布时间】:2019-02-24 01:56:30
【问题描述】:
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
.

【问题讨论】:

  • mm=mod(m-1,18)+1 ?
  • 我想你必须澄清如何处理36。你想让36 显示为36,还是18
  • @Adriaan 18 的所有倍数都是18,包括36mod(m-1,18)+1 效果很好。

标签: arrays matlab for-loop mod


【解决方案1】:

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 provided in the comments 的解决方案确实效果更好,我只是想表明,如果您希望 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

【讨论】:

    【解决方案2】:

    试试这个:

    mm = mod(m,18);
    mm(mm==0)=18;
    

    【讨论】:

    • 这与我的答案有何不同,我的答案是在您之前 20 小时发布的?此外,我为什么要“试试这个”? 解释为什么解决方案会起作用。
    • @Adriaan,我的印象是我回答了提出问题的人。你不需要尝试任何东西。对我来说,我宁愿不定义不必要的 tmp 变量。第一条评论有更简洁的解决方案,所以请丢弃我的。
    • 部分是;直接答案是给回答的人,但 Stack Overflow 努力成为一个知识数据库。这要求人们将来也能够找到并理解答案,因此最好解释一段代码为什么有效。至于你和我的代码之间的区别:我打电话给m=data;mm=tmp,不涉及临时变量。最后:我可以无视你的回答,discarding,即删除,只能由你按答案下方的“删除”按钮来完成,由你决定是否做或不做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-10
    相关资源
    最近更新 更多