2017-10-24 98 views
6

pragnę to lub (lub dowolny) wewnątrz funkcji, w których liczba argumentów (wektory logicznych) przeszedł w może być więcej niż dwie i może różnić się liczbą. Na przykład, funkcja dominująca może tworzyćZastosowanie „lub” funkcji do więcej niż dwóch wektorów Matlab

a=[1;0;0;0] 
b=[0;1;0;0] 
c=[0;0;0;1] 

ale następnym razem może dodać

d=[0;0;1;0] 

jak mogę dostać, w tym przypadku, aby dać mi X = [1; 1; 0 ; 1] za pierwszym razem i Y = [1; 1; 1; 1] po raz drugi? Liczba nosicieli może być do dwudziestu więc to musi być w stanie rozpoznać ile wektory są przekazywane w

Odpowiedz

9

To w jaki sposób to zrobić.

function y = f(varargin) 
y = any([varargin{:}], 2); 

varargin jest tablicą komórek z argumentami wejściowymi funkcji. {:} generuje comma-separated list tych argumentów, a [...] (lub horzcat) łączy je w poziomie. Więc teraz mamy macierz z każdym wektorem w kolumnie. Zastosowanie any wzdłuż drugiego wymiaru daje pożądany rezultat.

Ponieważ funkcja zawiera pojedynczą instrukcję można również zdefiniować go jako anonymous function:

f = @(varargin) any([varargin{:}], 2); 

Przykład zjazdowe:

>> f([1; 1; 0; 0], [1; 0; 0; 1]) 
ans = 
    4×1 logical array 
    1 
    1 
    0 
    1 

>> f([1; 1; 0; 0], [1; 0; 0; 1], [0; 0; 1; 0]) 
ans = 
    4×1 logical array 
    1 
    1 
    1 
    1 
2

Jestem pewien, że już myśli o tym:

a=[1;0;0;0] 
b=[0;1;0;0] 
c=[0;0;0;1] 
a|b|c % returns [1;1;0;1] 

Istnieje jednak znacznie prostsza odpowiedź na to:

any([a,b,c,d],2); 

można łatwo rozszerzyć, po prostu dodając zmienne jak wyżej, przed wprowadzeniem go do funkcji any. Jeśli chcesz umieścić go w funkcji tutaj, możesz to zrobić:

function customOr(varargin) 
    any(cell2mat(varargin),2) % equivalent to any([varargin{:}],2); 
end 
customOr(a,b,c) % returns [1;1;0;1] 
customOr(a,b,c,d) % returns [1;1;1;1]