【问题标题】:vectorized if in matlab如果在matlab中矢量化
【发布时间】:2011-12-14 14:55:02
【问题描述】:

我有一个布尔数组,称之为flag

我有两个数值数组ifTrueifFalse。所有这些数组都具有相同的大小,出于本问题的目的,假设这些数组中的每个元素都是唯一的。

我想要一个函数g,其属性为

a = g(flag, ifTrue, ifFalse)

all(flag == (a == ifTrue))
all(~flag == (a == ifFalse))

或者用英文,我希望gflag 为真时返回ifTrue 元素,在flag 为假时返回ifFalse 元素。

或者,在 matlab 中,我可以使用循环来做到这一点:

a = zeros(size(ifTrue));
for i = 1 : numel(ifTrue);
    if flag(i)
         a(i) = ifTrue(i)
    else
         a(i) = ifFalse(i)
    end
end

有矢量化方法吗?

谢谢

【问题讨论】:

    标签: matlab vectorization conditional-operator


    【解决方案1】:
    %# Given, for example:
    ifTrue = 1:10
    ifFalse = -ifTrue  
    flag = rand(1,10) > 0.5
    %# First, set 'a' to ifFalse
    a = ifFalse
    %# Then override the places where flag is true
    a(flag) = ifTrue(flag)
    

    【讨论】:

      【解决方案2】:

      假设该标志包含一个表示真,零表示假元素:a = flag .* ifTrue + (1 - flag) .* ifFalse;

      【讨论】:

      • 值得注意的是,这个解决方案不能正确处理 Inf 和 nan。接受的答案确实正确处理了这种情况。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-12
      • 2013-05-01
      相关资源
      最近更新 更多