我正在尝试按照以下逻辑替换 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:我使用的是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/