将"or"函数应用于两个以上的向量Matlab

Applying "or" function to more than two vectors 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]?矢量的数量可能多达 20 个,因此它需要能够识别传入的矢量数量。

我会这样做:

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

varargin is a cell array with the function input arguments. {:} generates a comma-separated list of those arguments, and [...] (or horzcat) concatenates them horizontally. So now we have a matrix with each vector in a column. Applying 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

我相信你已经想到了:

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]