如何解决根据逻辑替换数组中的特定值
我正在尝试按照以下逻辑替换 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
解决方法
这会导致无法执行赋值-错误,因为赋值的左侧和右侧的大小不同:您需要在cout << *(a[0]); // print first integer
两侧使用逻辑索引。
cout << **(a[0]); // error
这应该可以在MATLAB + Octave中使用。 您还可以拆分不同的操作:
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)
如果您绝对想坚持自己的方法,可以使用一些技巧:将% ensure positiveness
array1 = abs(array1);
% force to one
lg = array1 > 1;
array1(lg) = mod(array(1),1);
添加到array1 = 0.5000 0.3000 1.0000 0 0.20
函数的第二个输入中,以使+1e-10
“存活”下来;)
mod
此技巧将产生稍微不同的结果,因为模数是1
而不是array1 = mod( abs(array1),1+1e-10)
。输入数字越高,误差越大。但是,从您的示例数组中,我猜想这种风险可能还可以。
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。