2017-10-24 10 views
6

을 기능을 적용 "또는"나는 또는을 포함 할 (또는 어떤) 인수 (논리 벡터)의 수가 두 개 이상이 될 수 있습니다 전달 함수 내에서 번호가 다를 수 있습니다. 예를 들어, 부모 함수는두 개 이상의 벡터에 matlab에

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

을 만들 수 있지만 다음 번에

d=[0;0;1;0] 

내가 그것을 얻는 방법이 경우에, 저에게 X = 1을 제공하기 위해 추가 할 수 있습니다 1 0 ; 1] 처음으로 Y = [1; 1; 1; 1] 두 번째? 가 전달되는 방법 많은 벡터 인식 할 수 있어야 것일 정도로 벡터들의 수는 스물에까지 일 could

답변

9

이것은 내가 어떻게 할 것입니다 :.

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

varargin 셀 배열입니다 함수 입력 인자들. {:}은 해당 인수 중 comma-separated list을 생성하고 [...] (또는 horzcat)은 이들을 수평으로 연결합니다. 이제 우리는 각 벡터가 한 행에있는 행렬을가집니다. 두 번째 차원을 따라 any을 적용하면 원하는 결과를 얻을 수 있습니다. 함수가 하나의 문이 포함되어 있기 때문에

당신은 또한 anonymous function로 정의 할 수 있습니다 :

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

예를 실행 :

>> 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

을 당신은 이미 생각을 확신 :

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

그러나 이에 대한 훨씬 간단한 대답이 있습니다.

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

any 함수에 입력하기 전에 위의 변수를 단지 concatinating하여 쉽게 확장 할 수 있습니다. 함수에 넣으려면 다음과 같이하십시오.

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]