微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决根据逻辑替换数组中的特定值

我正在尝试按照以下逻辑替换 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

解决方法

这会导致无法执行赋值-错误,因为赋值的左侧和右侧的大小不同:您需要在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 举报,一经查实,本站将立刻删除。