是否有一个Matlab条件IF运营商可以INLINE放在像VBA的IIF(Is there a Ma

2019-07-19 00:45发布

在VBA我可以做到以下几点:

A = B + IIF(C>0, C, 0)

这样,如果C> 0 I得到A=B+C和C <= 0 I得到A=B

是否有一个运算符或函数,可以让我在MATLAB代码内嵌做这些条件语句?

Answer 1:

目前在Matlab没有三元操作。 你可以,当然,写,会做它的功能。 例如,下面的函数可以作为iif与第二输入为条件,并具有用于结果的数字和细胞ab

function out = iif(cond,a,b)
%IIF implements a ternary operator

% pre-assign out
out = repmat(b,size(cond));

out(cond) = a;

对于更先进的解决方案,有创建一个内联函数,甚至可以做ELSEIF的方式,如概括这个博客帖子大约匿名函数诡计 :

iif  = @(varargin) varargin{2*find([varargin{1:2:end}], 1, 'first')}();

您可以使用此功能

iif(condition_1,value_1,...,true,value_final)

其中可以使用任意数量的附加条件/值对更换点。

其工作原理是,它的值中选取第一个,其条件为真。 2*find(),1,'first')提供索引值参数。



Answer 2:

如何使用简单的事实需要时由操作该MATLAB自动转换变量类型? 例如,逻辑翻一番。

如果您的变量是标量双,你的代码,我认为,可以通过更换

a = b + (c > 0) * c;

在这种情况下,操作员(c > 0)1 (逻辑型)每当c > 0和值0 ,否则。



Answer 3:

目前对此没有内置的解决方案,但你可以写一个IIF自己 。

function result=iif(cond, t, f)
%IIF - Conditional function that returns T or F, depending of condition COND
%
%  Detailed 
%     Conditional matrix or scalar double function that returns a matrix
%     of same size than COND, with T or F depending of COND boolean evaluation
%     if T or/and F has the same dimensions than COND, it uses the corresponding 
%     element in the assignment
%     if COND is scalar, returns T or F in according with COND evaluation, 
%     even if T or F is matrices like char array.
%
%  Syntax
%    Result = iif(COND, T, F)
%           COND - Matrix or scalar condition
%           T  - expression if COND is true
%           F  - expression if COND is false
%           Result - Matrix or scalar of same dimensions than COND, containing
%                    T if COND element is true or F if COND element is false.
%
if isscalar(cond) 
   if cond 
       result = t;
   else
       result = f;
   end
else
  result = (cond).*t + (~cond).*f;
end  
end


Answer 4:

其他人已经说过,没有三元?:运营商在Matlab。 作为一个解决方案,我认为这个功能,这需要三个函数而不是值。 因此不必要的计算量最小化,并且可以在开始计算之前检查条件,例如,如果一个值实际上是数字,或有限的,或非零:

function [ out ] = iif( condition, thenF, elseF, in, out)
%iif Implements the ternary ?: operator
%   out = iif (@condition, @thenF, @elseF, in[, out])
%
%   The result is equivalent to:
%   condition(x) ? thenF(x) : elseF(x)
%
%   The optional argument out serves as a template, if the output type is
%   different from the input type, e.g. for mapping arrays to cells and
%   vice versa.
%
% This code is in the public domain.

mask = condition(in);
if nargin <= 4
  out = in;
end

if sum(mask)
  out(mask)  = thenF(in(mask));
end
if sum(~mask)
  out(~mask) = elseF(in(~mask));
end

end

使用这样的:

f = @(y)(iif(@(x)(x > 3), @(x)(x.^2), @(x)(x/2), y))
f(linspace(0,6,10))


Answer 5:

由乔纳斯的回答启发了以下功能也适用于混合型输入字符,为此,他的作用并不稳定。

function out = iif(cond, a, b)
%IIF implements a ternary operator

    % Use cell output for either char or mixed type input
    if ischar(a) || ischar(b) || ~strcmp(class(a), class(b))
        out = cell(size(cond));
        [out{cond}] = deal(a);
        [out{~cond}] = deal(b);
    else
        % Use array output and logical indexing
        out = repmat(b, size(cond));
        out(cond) = a;
    end
end

编辑 :淘汰的小室的额外条件选项,这显然是一个错误之前的残存,这可能是快,绝对干净。



Answer 6:

现在有一个tern在MathWorks的文件交换功能: http://www.mathworks.com/matlabcentral/fileexchange/39735-functional-programming-constructs/content/tern.m

该代码是在这里转载:

function varargout = tern(condition, true_action, false_action)

% out = tern(condition, true_action, false_action)
% 
% Ternary operator. If the first input is true, it returns the second
% input. Otherwise, it returns the third input. This is useful for writing
% compact functions and especially anonymous functions. Note that, like
% many other languages, if the condition is true, not only is the false
% condition not returned, it isn't even executed. Likewise, if the
% condition is false, the true action is never executed. The second and
% third arguments can therefore be function handles or values.
%
% Example:
%
% >> tern(rand < 0.5, @() fprintf('hi\n'), pi)
% ans =
%     3.1416
% >> tern(rand < 0.5, @() fprintf('hi\n'), pi)
% hi
%
% It works with multiple outputs as well.
%
% >> [min_or_max, index] = tern(rand < 0.5, ...
%                               @() min([4 3 5]), ...
%                               @() max([4 3 5]))
% min_or_max =
%      5
% index =
%      3
%
% Tucker McClure
% Copyright 2013 The MathWorks, Inc.

    if condition() % Works for either a value or function handle.
        [varargout{1:nargout}] = true_action();
    else
        [varargout{1:nargout}] = false_action();
    end

end


Answer 7:

这更是一个addenum亚历克斯的回答。

当你想回到Alex的方法是行不通的inf

在这种情况下,你往往最终得到一个0*inf数字,这将MATLAB计算结果NaN 。 问题...我们可以利用查找,而不是避免这种乘法。

作为一个例子,在凸优化有用的屏障功能是什么,行为像log随处可见阳性, -inf别处。 这里是你会如何使用查找创建这样一个功能:

INF_CONDITION = [0, inf];
fn_logbr = @(x) (x>0)*log(x) - INF_CONDITION( 1+(x<=0) )

内嵌条件语句是一个黑客,而你失去了懒惰的评价。 你必须要小心。 然而,具有语义代码是非常好的,它更容易分享您的代码时,你不能保证每个人的环境是一样的。



文章来源: Is there a Matlab conditional IF operator that can be placed INLINE like VBA's IIF