【问题标题】:Matlab conditional assignment [duplicate]Matlab条件赋值[重复]
【发布时间】:2011-09-18 13:11:36
【问题描述】:

我正在寻找相当于 c#condition ? true-expression : false-expression 条件赋值的 Matlab。我知道的最多的是a = 5>2,是真\假赋值,
但是是否有任何一行条件赋值 if condition a=1;else a=2; end?

【问题讨论】:

  • 非常接近成为这个的副本:if-statement in matlab 你可能会发现那里的一些答案很有帮助。

标签: matlab


【解决方案1】:

对于数值数组,还有另一种解决方案--

// C: 
A = COND ? X : Y;

变成

% MATLAB
% A, X and Y are numerics 
% COND is a logical condition.

A = COND.*X + (~COND).*Y ;

优势:

对于向量或大型数组并行工作非常好 - A 中的每个项目都根据相应的条件进行分配。同一行适用于:

  • 条件是标量,数组XY 大小相等
  • 条件是任意大小的数组,X 和 Y 是标量
  • 条件和 X 和 Y 都是相同大小的数组

警告:

不适用于NaNs。谨防!如果X 的一个元素是nan,或者Y 的一个元素是nan,那么无论条件如何,你都会在A 中得到一个NaN

非常有用的推论:

您可以使用bsxfun,其中CONDX/Y 具有不同的大小。

A = bsxfun( @times, COND', X ) +  bsxfun( @times, ~COND', Y );

例如,CONDX/Y 是不同长度的向量。

干净吗?

【讨论】:

    【解决方案2】:

    单行条件赋值:

    a(a > 5) = 2;
    

    这是一个逻辑索引示例,a > 5 是一个逻辑(即布尔值或二进制)矩阵/数组,其大小与 a 相同,并且在表达式为真的情况下为 1。上述赋值的左边是指a 中的所有位置,其中a>5 有一个1

    b = a > 5; % if a = [9,3,5,6], b = [1,0,0,1]
    a(~b) = 3;
    c = a > 10;
    a(b&c) = ...
    

    等等......你可以用这样的逻辑数组做任何你期望的事情。

    【讨论】:

    • 可以放入else吗? - 在这两种情况下分配一些东西?比如:a (b&c) = 1 : 0;
    • @skofgar 唯一的方法是使用两行代码:a(b&c) = 1;a(b~=c) = 0;a(xor(b,c)) = 0
    • 等等,我很愚蠢。 b = a > 5;后面的b的值是多少?
    • 一个逻辑(布尔)值数组,每个元素保存a 中相应元素的条件输出。将其视为a 上的二进制“掩码”,指示a 包含大于5 的值。更新了一点评论。
    • 它说什么?如果条件为真,则将2 分配给a,否则什么都不做?
    【解决方案3】:

    Matlab 没有三元运算符。你虽然很容易编写一个函数来为你做这样的事情:

    function c = conditional(condition , a , b)
        if condition
            c = a;
        else
            c = b;
        end
    end
    

    【讨论】:

      猜你喜欢
      • 2012-10-19
      • 1970-01-01
      • 2011-03-06
      • 2018-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-02
      • 1970-01-01
      相关资源
      最近更新 更多