VBAでは、次のことができます。
A = B + IIF(C>0, C, 0)
C> 0の場合A=B+C
、C <= 0の場合、次のようになります。A=B
これらの条件をMATLABコードでインラインで実行できる演算子または関数はありますか?
VBAでは、次のことができます。
A = B + IIF(C>0, C, 0)
C> 0の場合A=B+C
、C <= 0の場合、次のようになります。A=B
これらの条件をMATLABコードでインラインで実行できる演算子または関数はありますか?
操作で必要な場合、MATLAB が自動的に変数の型を変換するという事実を単純に利用するのはどうでしょうか? たとえば、logical から double へ。
変数がスカラー倍精度の場合、コードは次のように置き換えることができると思います
a = b + (c > 0) * c;
この場合、演算子の(c > 0)
値1
(論理型) はいつでもc > 0
、値は0
それ以外の場合です。
Matlab には三項演算子はありません。もちろん、それを行う関数を書くこともできます。たとえば、次の関数は、条件の nd 入力と同様に機能し、結果とiif
の数値とセルを使用します。a
b
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')
値の引数にインデックスを提供します。
これに対する組み込みのソリューションはありませんが、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
ジョナスの答えに触発されて、以下の関数は混合型入力と文字に対しても機能しますが、彼の関数は安定していません。
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
編集:セルブランチの余分な条件付きオプションを取り除きました。これは明らかに以前の間違いの名残でした。これはおそらくより速く、間違いなくきれいです。
これは、アレックスの回答への補足です。
戻りたいときにアレックスの方法が機能しないinf
このような場合、多くの場合0*inf
、MATLAB が に評価する Figure を取得することになりNaN
ます。問題があります...代わりにルックアップを使用して、この乗算を回避できます。
log
例として、凸最適化における有用なバリア関数は、どこでも正のように動作し、-inf
他の場所では正のように動作するものです。ルックアップを使用してそのような関数を作成する方法を次に示します。
INF_CONDITION = [0, inf];
fn_logbr = @(x) (x>0)*log(x) - INF_CONDITION( 1+(x<=0) )
インライン条件はハックであり、遅延評価を失います。あなたは注意する必要があります。ただし、セマンティック コードを使用することは非常に優れており、全員の環境が同じであることを保証できない場合でも、コードを簡単に共有できます。
使用:
eval('input;', 'input = 1;');
そもそも「入力」が存在しない可能性がある場合に非常に役立ちます。