2011-12-14 27 views
6

Tôi có một mảng boolean gọi là flag.được vector hóa nếu trong MATLAB

Tôi có hai mảng số ifTrue, ifFalse. Tất cả các mảng này có cùng kích thước, Vì mục đích của câu hỏi này, giả sử mọi phần tử trong các mảng này là duy nhất.

Tôi muốn một hàm g với tài sản mà

a = g(flag, ifTrue, ifFalse) 

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

Hoặc bằng tiếng Anh, tôi muốn g trở ifTrue yếu tố khi flag là đúng, và ifFalse yếu tố khi flag là sai.

Hoặc, trong matlab, tôi có thể làm điều này với vòng:

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

Có một cách tiếp cận vectorized?

Cảm ơn

Trả lời

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) 
+0

1 Giải pháp này là hiệu quả hơn so với tôi :) – kol

1

Giả sử cờ có chứa những cho đúng, và số không cho các yếu tố sai: a = flag .* ifTrue + (1 - flag) .* ifFalse;

+0

Nó có thể là đáng chú ý, đó giải pháp này không xử lý đúng cách của Inf và nan. Câu trả lời được chấp nhận không xử lý đúng trường hợp đó. – John

Các vấn đề liên quan