演算子

イントロダクション

LabTalkでは、代入演算子、算術演算子、論理演算子、関係演算子、条件演算子の5種があります。

算術演算子   +     -     *     /     ^     &     |
文字列の連結   +
代入演算子   =     +=     -=     *=     /=     ^=
論理・関係演算子   >     >=     <     <=     ==     !=     &&     ||
条件演算子   ? :

これらの演算子はスカラーで計算されますが、多くの場合、ベクトル(データセット)でも演算させることができます。また、Originにはデータセットに対して実行可能な数値関数、数学関数、三角関数、統計関数が組み込まれています。

LabTalkでは、数式の評価にあたり、以下の優先順位の規則を適用します。

  1. 括弧のない代入演算子が評価されます。
  2. 括弧内(...)の演算が括弧外の演算より優先されて評価されます。
  3. 乗算(*) と除算(/) が、加算(+) と減算(-) より優先されて実行されます。
  4. 関係演算子(>,>=,<,<=)が評価されてから、等号・不等演算子(==と!=)が評価されます。
  5. 論理演算子 || は&&より先に評価されます。
  6. 最後に、条件演算子(?:)が評価されます。

算術演算子

Originでは、以下の算術演算子を利用できます。

演算子 説明
+
加算
-
減算
*
乗算
/
除算
^
ベキ乗 (X^YはXをY乗を示す) (下記Noteを参照)
&
ビットごとの論理積(And)演算子。数値を構成するバイナリビットに対して実行
|
ビットごとの論理和(Or)演算子。数値を構成するバイナリビットに対して実行

Note: 0 の累乗 n (0^n)では、n > 0の場合、 0 が返されます。If n < 0の場合、欠損値が返されます。n = 0の場合、1が返されるか( @ZZ = 1の場合) または 欠損値が返されます( @ZZ = 0の場合)。

これらの演算子はスカラーおよびベクトル(データセット)で演算することができます。スカラーやベクトル計算に関する詳細は、計算の実行 を参照してください。

次の例で、指数演算子の使用法を説明します。 コマンドウィンドウに次のスクリプトを入力します。

1.3 ^ 4.7 =

ENTERキーを押すと、3.43189がコマンドウィンドウに表示されます。 次のサンプルは、ビットごとの論理積(AND)演算子の使用例を示しています。コマンドウィンドウに以下のスクリプトを入力します。

if (27&41 == 9)
{type "Yes!"}

ENTERキーを押すと、 Yes! がコマンドウィンドウに表示されます。

Note: 27&41 == 9 となるのは、

27 = 0000000000011011
41 = 0000000000101001

ビットごとに&(and)を施すと

0000000000001001 (となり、これは 9に等しくなります)

Note: 乗算では掛算記号の*を明示しなくてはいけません。例えば、変数Xに定数2を掛ける場合、2Xではなく、2*Xと記述します。

定数の定義

ユーザファイルフォルダのCONST.CNFファイル内にグローバルな定数を定義することができます。

//オイラー数
const e = 2.718281828459045

対数変換についての注意

  • データセットを対数スケールに変換するには、次の構文を使用します。
col(c) = log(col(c));
  • データセットを線形スケールに変換し直すには、次の構文を使用します。
col(c) = 10^(col(c));

文字列の連結

まれに文字列変数または文字列レジスタ型の複数の文字列を連結する必要がある場合があります。 このセクションのコード部分すべてで、"Hello World."という文字列を返します。

文字列連結演算子は、プラス記号(+)で、2つの文字列を連結するために使用します。

aa$ ="Hello";
bb$="World";
cc$=aa$+" "+bb$;
cc$=;

2つの文字列レジスタを連結するには、単にそれらを並べるだけです。

%J="Hello";
%k="World";
%L=%J %k;
%L=;

文字列変数と文字列レジスタの両方を操作する必要がある場合、%( ) 置換表記を利用して以下のようにします。

aa$ ="Hello";
%K="World";
dd$=%(aa$) %K;
dd$=;
dd$=%K;
dd$=aa$+" "+dd$;
dd$=;
%M=%(aa$) %K;
%M=;

代入演算子

Originでは、以下の代入演算子を利用できます。

演算子 説明
=
変数(やデータセット)に引数を割り当てる。
+=
変数(やデータセット)の内容に引数を加えて、割り当てる。
-=
変数(やデータセット)の内容から引数を引いて、割り当てる。
*=
変数(やデータセット)の内容に引数を掛けて、割り当てる。
/=
変数(やデータセット)の内容を引数で割って、割り当てる。
^=
変数(やデータセット)の内容を引数でベキ乗して、割り当てる。

これらの演算子はスカラーおよびベクトル(データセット)で演算することができます。スカラーやベクトル計算に関する詳細は、計算の実行 を参照してください。

次のサンプルは-=演算子の使用法を示しています。

この例では、変数 Aの値から5を引き、結果をAに割り当てています。

A -= 5;

次のサンプルでは、Book1_B中の各値をBook1_A中の対応する値で割り、結果をBook1_Bに割り当てるものです。

Book1_B /= Book1_A;

これらの代入演算子に加えて、LabTalkは、インクリメントおよびデクリメント演算子にも対応しています(スカラーのみ、ベクトルは不可)。

演算子 説明
++
変数の内容に1を加えて、割り当てる。
--
変数の内容から1を引いて、割り当てる。

次のforループの式は、インクリメント演算子++の一般的な使用法を示しています。スクリプトは現在のワークシートの2番目の列にあるデータをコマンドウィンドウに出力します。

for (ii = 1; ii <= wks.maxrows; ii++)
   {type ($(col(2)[ii])); }

論理・関係演算子

Originでは、以下の比較・論理演算子が利用できます。

演算子 説明
>
より大きい
>=
以上
<
より小さい
<=
以下
==
等しい
!=
等しくない
&&
かつ
||
または

比較・論理演算子を使った式は、真(非ゼロの値)、偽(ゼロ)のいずれかに評価されます。 論理演算子は、通常、条件構造とループ構造の中で使用します。

数値の比較

最も一般的な比較は2つの数値を比較することです。 一般的には、少なくとも一方が変数です。 例えば

if aa<3 type "aa<3";

または、両方の項目を変数にして比較することもできます。

if aa<=bb type "aa<=bb";

括弧を使って、同じ論理ステートメント内で複数比較することもできます。

if (aa<3 && aa<bb) type "aa is lower";

文字列の比較

2つの文字列の比較には、==と!=の演算子が使えます。 演算子の前か後に置かれて比較される文字列定数は(数値の比較の場合とは違い)、引用符(")で囲まれなければなりません。 次のスクリプトは%A が空文字列かどうかを調べます。

if (%A == ""){type "empty"};

「等号(==)」の比較演算子の利用方法

x = 1;     // 変数 x に1をセット
%a = x;    // 文字列 a に"x"をセット

if (%a == 1);
      type "yes";
else
      type "no";

Originは%aの値(xの値)を探し、これが1なので、結果は、yesとなります。次のスクリプトと見比べてください。 次のスクリプトと見比べてください。

x = 1;     // 変数 x に1をセット 
%a = x;    // 文字列 a に"x"をセット 
if ("%a" == 1)
      type "yes";
else
      type "no";

このスクリプトでは、%aが二重引用符で囲まれているので、文字列とみなされ、その結果 %aは1ではなく xとなり、結果は no となります。

条件演算子 (?:)

三項演算子 または 条件演算子 (?:) は、次のような構文で使用されます。

Expression1 ? Expression2 : Expression3

ここで、まず最初にExpression1が評価されます。 もしそれが真(ゼロでない値)であれば、Expression2が評価されます。 このExpression2の値がこの条件式の値となります。 Expression1が偽(ゼロ)であると、Expression3が求められ、それがこの条件式の値となります。 Expressions1と2の表現自体を条件演算子にしてネストすることも可能です。 次の例ではmとnの大きい方の値を変数に割り当てます。

m = 2;
n = 3;
variable = (m>n?m:n);
variable =

LabTalkは以下を返します。 variable = 3

次の例では、スクリプトがA列にある全ての5.5から5.9の値を5.6に置き換えます。

col(A) = col(A)>5.5&&col(A)<5.9?5.6:col(A);

Note: しきい値置換関数tReplace(dataset, value1, value2 [, condition]) でもデータセットの値を評価することができ、条件によって、他の値にそれらを置換することができます。 tReplace(dataset, value1, value2 [, condition])関数では、データセットの各値は条件に応じてvalue1 と比較されます。 比較が真の時、その値はcondition の値に応じてValue2 または -Value2に置換されます。 比較が偽の時、その値はcondition の値に応じてそのままの値を保つか欠損値で置き換えられます。 treplace() 関数は条件演算子よりも高速に処理されます。tReplace()を参照してください。

計算の実行

LabTalkを使って、以下の両方の演算を実行可能です。

  • スカラー計算 (一変数の数学演算)
  • ベクトル計算 (データセット全体の数学演算)

スカラー演算

LabTalkを使って、演算を実行し、結果を数値で格納することができます。 例えば、以下のスクリプトを見てみましょう。

inputVal = 21;
myResult = 4 * 32 * inputVal;

この例の2行目では、計算を実行し、変数myResultを作成しています。 計算の結果が変数 myResultに格納されます。

変数が被演算子(オペランド)であり、結果が格納される場合、簡易表記が利用できます。 例えば、次のスクリプトは

B = B * 3;

次のように記述することができます。

B *= 3;

この例では、変数Bに割り当てられた結果に対して乗算がなされています。同様に、+=、 -=、 /=、 ^=も利用可能です。 簡易表記を使えば、スクリプトは高速に実行されます。

ベクトル演算

変数への演算の実行および結果の実行(スカラー演算)に加えて、LabTalkを使って、データセットへの演算を行うことができます。

ベクトル計算は、(1) 一行毎に正確に行う、(2) 線形補間を使う、のいずれかの方法で実行されます。

行ごとの計算

ベクトル演算は一般的な記法を用いている場合には常に行ごとに実行されます。

datasetB = scalarOrConstant <operator> datasetA;

datasetC = datasetA <operator> datasetB;

これはデータセットの要素数が異なる場合でも当てはまります。ワークシートにA, B, Cの3つの空の列があるものとします。次のスクリプトを実行します。

col(a) = {1, 2, 3};
col(b) = {4, 5};
col(c) = col(a) + col(b);

列Cの結果は、 {5, 7, --}となります。つまり、Originはデータセットに値が含まれない場合、行に対して欠損値を出力します。

ベクトル計算は、スカラー計算も実行できます。上記の例で、次のように入力します。

col(c) = 2 * col(a);

列Aを2倍して、結果を列Cの対応する行に出力します。

または、次のスクリプトを実行します(newDataは以前には作成されていないものとします)。

newData = 3 * Book1_A;

newDataという名前の一時データセットが作成され、ベクトル演算の結果が割り当てられます。

補間を使った計算

Originは、範囲表記interp1および interp1xyのようなXファンクションを使った補間をサポートします。詳細は、補間を参照して下さい。