【问题标题】:Constrain values in matlab在matlab中约束值
【发布时间】:2012-02-27 21:02:08
【问题描述】:

如果我在 matlab 中有一个简单的数组,比如说:

a = [0 1 2 3 4 5 6 0 0]

我如何约束该数组中的值(例如,如果我希望最大值为 1,那么要达到:

a = [0 1 1 1 1 1 1 0 0]

最简单、最有效的方法是什么?

【问题讨论】:

    标签: matlab constraints


    【解决方案1】:
    a(a>1) = 1;
    

    这可以满足您的要求...您可以对其他约束遵循相同的模式。

    编辑:评论者是正确的,已修复。

    【讨论】:

    • 这几乎是正确答案,但应该是a(a>1) = 1;
    【解决方案2】:
    a > 0
    

    min(a, 1)
    

    (在 Octave 中测试。)

    【讨论】:

    • 你的意思是一个 if-loop 来测试 a > 0?因为我更喜欢一种没有循环的方法。在matlab中必须有一种方法可以在没有循环的情况下做到这一点..
    • @Samuel:不,只是表达式a > 0
    • a>0 返回一个逻辑索引,而不是一个新矩阵。您可以使用逻辑索引将 a 中的适当元素设置为某个值。
    • @tmpearce:啊。在 Octave 中,它返回一个由 0 和 1 组成的矩阵。我的基于min 的解决方案在Matlab 中有效吗?
    • 我相信是这样 - 你的 a<0 作为逻辑索引可以转换为 0 和 1 - 但是使用“正确”的逻辑索引可以让你更容易地修改代码,例如在价值或几乎其他任何东西。您的两种用法都特别适用于有限数量的情况 - 优雅且快速,但不容易修改。
    【解决方案3】:

    试试:

    arrayfun(@(x) min(1,x),a)
    

    求最大值,用 max(val,x) 代替最小值。

    【讨论】:

    • 野蛮矫枉过正。滥用 arrayfun 来做 min(a,1) 已经被向量化的事情。更糟糕的是,对于显着长度的向量,它比直接使用 min 慢 1000 倍!
    • 同意,我想使它适合任何需要有点得意忘形,但错过了满足要求!
    猜你喜欢
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多