演算子

はじめに

LabTalkは代入演算子、算術演算子、論理演算子、比較演算子、条件演算子をサポートしています。

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

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

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

  1. 括弧の外の代入演算子が評価されます。
  2. 括弧内の演算は、括弧外の演算よりも先に評価されます。
  3. 乗算と除算は加算と減算の前に行われます。
  4. 論理・比較演算子は (>, >=, <, <=) が先に評価され、その後 (== および !=) が評価されます。
  5. 論理演算子 || は && より先に評価されます。
  6. 条件演算子 (?:) が評価されます。

算術演算子

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

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

Note: 0 のn乗n (0^n)では、n > 0の場合、 0 が返されます。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"};

次のスクリプトは、2つの文字列が同じでないかどうかを調べます。

str1$ = "apple";
str2$ = "banana";
if (str1$ != str2$) {type "different fruits";}

次のスクリプトは==演算子の使用法を示しています。

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

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

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

結果はnoとなります。この理由は、Originは %aが引用符で囲まれているため、値1ではなく文字xを持つ文字列として扱うからです。

条件演算子 (?:)

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

Expression1 ? Expression2 : Expression3

この式は最初にExpression1を評価します。 Expression1が真(ゼロでない)の場合、Expression2が評価されます。 このExpression2の値が条件式の値となります。 Expression1が偽(ゼロ)の場合、Expression3が評価され、Expression3が条件式全体の値となります。 Expressions1とExpressions2は条件演算子になることができます。 次の例では、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 と比較されます。 比較が真の場合、条件の値に応じて値をValue2または-Value2に置き換えることができます。 比較が偽の場合、値は保持されるか、条件の値に応じて欠損値に置換されます。 treplace()関数は三項演算子よりも高速です。tReplace()を参照してください。

演算の実行

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

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

スカラー演算

LabTalkを使用して演算を実行し、結果を数値変数に格納することができます。 例えば、次のスクリプトのようにします。

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

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

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

B = B * 3;

次のように書くこともできます。

B *= 3;

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

ベクトル演算

演算を実行し、結果を変数に格納する(スカラー計算)だけでなく、LabTalkを使用してデータセット全体の演算も実行できます。

ベクトル演算は、(1)厳密に行単位で行う方法と、(2)線形補間を使用する方法のいずれかで行うことができます。

行ごとの計算

次の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は範囲表記interp1interp1xyなどのXファンクションによる補間をサポートしています。詳細は補間を参照してください。