Matlab条件赋值

20

我正在寻找Matlab中类似于c#的condition ? true-expression : false-expression条件赋值的等效方法。我目前了解的最多的是a = 5>2,这是一个真/假赋值,但是否有一行代码的条件赋值可以代替if condition a=1;else a=2; end


1
非常接近于这个重复问题:Matlab中的if语句。你可能会发现那里的一些答案有帮助。 - gnovice
3个回答

24

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

// 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都是相同大小的数组

警告:

不支持处理NaN,请注意!如果X的某个元素是nan,或者Y的某个元素是nan,则无论条件如何,A中都将得到一个NaN

非常实用的推论:

CONDX/Y具有不同的大小时,可以使用bsxfun

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

这个示例适用于CONDX/Y长度不同的向量。

很简单,对吧?


23

一行条件赋值:

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) = ...

等等......你可以通过这样的逻辑数组做任何你预期的事情。


2
能否加入一个else语句?- 在两种情况下都分配一些东西吗?比如:a(b&c)= 1:0; - skofgar
1
@skofgar,唯一的方法是使用两行代码:a(b&c) = 1;a(b~=c) = 0; 或者 a(xor(b,c)) = 0 - reve_etrange
等等,我有点傻。在执行 b = a > 5; 后,变量 b 的值是多少? - 425nesp
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - reve_etrange
它的意思是什么?如果条件为真,则将2赋值给a,否则不执行任何操作? - lolelo

21

Matlab没有三元运算符。不过您可以轻松编写一个函数来实现这样的功能:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接