2017-10-24 13 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] 2回目?それはに渡されているどのように多くのベクトルを認識できるようにする必要がありますので、ベクトルの数は20までとすることができ

答えて

9

これは私がそれを行うだろうかです:。

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

vararginは、セル配列であります関数入力引数。 {:}はこれらの引数のうちcomma-separated listを生成し、[...](またはhorzcat)はそれらを水平に連結します。これで、各ベクトルが1つの列に含まれる行列が作成されました。 2番目の次元に沿って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関数に入力する前に簡単に拡張することができます。ここに関数を入れたい場合は、次のようにします。

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] 
関連する問題