根据逻辑替换数组中的特定值
Replacing specific values in an array based on logic
我正在尝试按照以下逻辑替换 array1 中的值:
- 如果值大于 1,则仅使用小数值。
- 如果正好是 1,则保持在 1
- 如果0留0
- 如果否定变为肯定并遵循逻辑
我使用的代码是:
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
我正在尝试按照以下逻辑替换 array1 中的值:
- 如果值大于 1,则仅使用小数值。
- 如果正好是 1,则保持在 1
- 如果0留0
- 如果否定变为肯定并遵循逻辑
我使用的代码是:
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