6

I have a boolean array call it flag.

I have two numeric arrays ifTrue, ifFalse. All these arrays are the same size, For purposes of this question assume every element in these arrays is unique.

I would like a function g with the property that

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

Or in English, I would like g to return ifTrue elements when flag is true, and ifFalse elements when flag is false.

Or, in matlab, I could do this with loops:

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

Is there a vectorized approach?

Thanks

2 Answers 2

8
%# 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) 
Sign up to request clarification or add additional context in comments.

Comments

1

Assuming that flag contains ones for true, and zeros for false elements: a = flag .* ifTrue + (1 - flag) .* ifFalse;

1 Comment

It might be worth noting, that this solution doesn't handle Inf's and nan's properly. The accepted answer does handle that case correctly.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.