arrays - 根据逻辑替换数组中的特定值

标签 arrays matlab math octave modulo

我正在尝试按照以下逻辑替换 array1 中的值:

  1. 如果值大于 1,则仅使用十进制值。
  2. 如果恰好是 1 则留在 1
  3. 如果 0 则保留 0
  4. 如果否定就是肯定并遵循逻辑

我使用的代码是:

array1=[0.5 1.3 1.0 0.0 -0.2 -2.78]
array1(array1>1)=mod(abs(array1),1)

我期望得到的是array1 = [0.5 0.3 1.0 0.0 0.2 0.78]

但是我收到错误:=:不一致的参数(op1 是 1x1,op2 是 1x5)我该如何解决这个问题?

PS:我使用的是Octave 5.2,它类似于Matlab

最佳答案

这会导致无法执行分配错误,因为分配的左侧和右侧大小不同:您需要在两侧使用逻辑索引array1>1.

array1=[0.5 1.3 1.0 0.0 -0.2]
% create logical vector for indexing
lg = array1 > 1
% replace elements
array1(lg) = mod( abs(array1(lg)) ,1)

这应该可以在 MATLAB + Octave 中运行。 您还可以拆分不同的操作:

% ensure positiveness
array1 = abs(array1);
% force to one
lg = array1 > 1;
array1(lg) = mod(array(1),1);

这会返回 数组1 = 0.5000 0.3000 1.0000 0 0.20

如果你绝对想坚持你的方法,你可以使用一个小技巧:将 +1e-10 添加到 mod 函数的第二个输入,让 1 “幸存”操作;)

array1 = mod( abs(array1) ,1+1e-10)

这个技巧会产生稍微不同的结果,因为模数是 1.0000000001 而不是 1。输入的数字越大,误差就越大。但是,从您的示例数组来看,我猜测这种风险可能是可以的。

关于arrays - 根据逻辑替换数组中的特定值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64603590/

相关文章:

java - 为什么我的 java if 语句不起作用并给我这个错误 : "bad operand types for binary operator ' & &'"?

Javascript按给定的数组元素拆分字符串

ruby - 欧拉计划 #368(数学公式)

recursion - 为什么在传递否定参数时我的代码会卡在递归调用中?

java - 处理虚数,跳跃捕捉

c# - 为什么 Array.Sort 在使用 Array.ForEach 后工作得更快?

javascript - 将新属性推送到数组中的对象

matlab - 向量中的数字出现

c++ - 无法将参数 2 从 'mxArray **' 转换为 'mwArray &'

matlab - 如何在 MATLAB 中对齐子图中的绘图/图形?