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

Replacing specific values in an array based on logic

我正在尝试按照以下逻辑替换 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:我正在使用类似于 Matlab 的 Octave 5.2

这会导致无法执行赋值错误,因为赋值的左侧和右侧大小不同:您需要在两侧使用逻辑索引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);

这个returns array1 = 0.5000 0.3000 1.0000 0 0.20

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

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

这个技巧会产生略有不同的结果,因为模数是 1.0000000001 而不是 1。输入的数字越大,误差就会越大。但是,从您的 example-array 来看,我猜想这种风险是可以接受的。

max 的回答让我到达了我需要到达的地方,这是我使用的。

array1=[0.5 1.3 1.0 0.0 -0.2 -2.63]

array1=abs(array1) %1) make array positive
lg = array1 > 1 %2) create logical vector for indexing
array1(lg) = mod( abs(array1(lg)) ,1) %3) replace elements
array1 =

   0.50000   1.30000   1.00000   0.00000  -0.20000  -2.63000

array1 =

   0.50000   1.30000   1.00000   0.00000   0.20000   2.63000

lg =

  0  1  0  0  0  1

array1 =

   0.50000   0.30000   1.00000   0.00000   0.20000   0.63000