▲ 006_演算子
■ 006_ 演算子の処理優先順位と演算

 演算子の処理優先順位は次のとおりです。番号が大きくなるに従って優先順位は高くなります。

(0) = , ←

(1) or

(2) and

(3) < , <= , == , >= , >

(4) + , -

(5) * , / , ・ , <*>

(6) ! , ' , ^

(7) ()

【例】

RGB = popRGBColor(0);

a = rand(5,5);

b = hokan(a,100,100);

b# = densityPlot(b,|1,0|);

c = b・(b<=0.3 or b>=0.6);

c# = densityPlot(c,|1,0|);

addP(b#,c#);

.OK.

 この例では乱数で作成した5行5列の行列を100行100列に補間し濃淡図を作成しています。次に補間したデータで 0.3 以下または 0.6 以上のデータだけを残し、それ以外の部分をゼロにし濃淡図を作成しています。最後にこの2つの濃淡図を横に結合し表示しています。

■ +加算

行列の加算を行います。

A + B

A,B 共にm行n列の行列の大きさが等しくなければなりません。特別な場合として

(1)A,B のいずれかが1行1列の行列の場合には大きい行列の型に一致します。

(2)Aがm行n列で、Bがm行1列の場合には例のような計算をします。

(3)Aがm行n列で、Bが1行n列の場合には例のような計算をします。

● 例

2+5;

7.0000

.OK.

|1,2|+|3,1|;

4.0000 3.0000

.OK.

|1,2||2,3|+|3,2||2,1|;

4.0000 4.0000

4.0000 4.0000

.OK.

|2,3||2,1|+5;

7.0000 8.0000

7.0000 6.0000

.OK.

|1,2||2,3||2,3|+|10,20,30|';

11.0000 12.0000

22.0000 23.0000

32.0000 33.0000

.OK.

|1,2||2,3||3,4|+|2,1|;

3.0000 3.0000

4.0000 4.0000

5.0000 5.0000

.OK.

■ -減算

 行列の減算を行います。

A - B

A,B 共にm行n列の行列の大きさが等しくなければなりません。特別な場合として

(1)A,B のいずれかが1行1列の行列の場合には大きい行列の型に一致します。

(2)Aがm行n列で、Bがm行1列の場合には例のような計算をします。

(3)Aがm行n列で、Bが1行n列の場合には例のような計算をします。

● 例
2-5;

-3.0000

.OK.

|1,2|-|3,1|;

-2.0000 1.0000

.OK.

|1,2||2,3|-|3,2||2,1|;

-2.0000 0.0000

0.0000 2.0000

.OK.

|2,3||2,1|-5;

-3.0000 -2.0000

-3.0000 -4.0000

.OK.

|1,2||2,3||2,3|-|10,20,30|';

-9.0000 -8.0000

-18.0000 -17.0000

-28.0000 -27.0000

.OK.

|1,2||2,3||3,4|-|2,1|;

-1.0000 1.0000

0.0000 2.0000

1.0000 3.0000

.OK.

■ *行列の乗算

行列の乗算を行います

【注意】行列の乗算です。

A * B

 A はm行n列、B はn行p列の行列でなければなりません。結果はm行p列の行列になります。特別な場合として A または B が1行1列の場合には各要素に対して乗算が計算されます。行列の要素どうしの乗算には <*> または ・ を使います。

● 例

5 * 9;

45.0000

.OK.

A = |1,2,3||2,3,4|;

A;

1.0000 2.0000 3.0000

2.0000 3.0000 4.0000

.OK.

B = |3,2||2,4||2,1|;

B;

3.0000 2.0000

2.0000 4.0000

2.0000 1.0000

.OK.

A * B;

13.0000 13.0000

20.0000 20.0000

.OK.

|1,2,3||2,3,4|*5;

5.0000 10.0000 15.0000

10.0000 15.0000 20.0000

.OK.

■ <*> ・要素どうしの乗算

行列の要素どうしの乗算を行います。

A<*>B

A ・ B

A,B 共に大きさが等しいm行n列の行列でなくてはなりません。特別な場合として

(1)A,B のいずれかが1行1列の行列の場合には大きい行列の型に一致します。

(2)Aがm行n列で、Bがm行1列の場合には例のような計算をします。

(3)Aがm行n列で、Bが1行n列の場合には例のような計算をします。

a=|1,2,3||2,3,4|;

a;

1.0000 2.0000 3.0000

2.0000 3.0000 4.0000

.OK.

b=|3,2,1||4,3,2|;

b;

3.0000 2.0000 1.0000

4.0000 3.0000 2.0000

.OK.

a<*>b;

3.0000 4.0000 3.0000

8.0000 9.0000 8.0000

.OK.

a<*>|1,2|';

1.0000 4.0000 3.0000

2.0000 6.0000 4.0000

.OK.

b<*>|1,2,3|;

3.0000 4.0000 3.0000

4.0000 6.0000 6.0000

.OK.

■ /要素どうしの除算  (逆行列ではない)

 行列の要素どうしの除算を行います。行列の除算ではありません。行列の除算には逆行列を使います。

A / B

特別な場合として

(1)A,B のいずれかが1行1列の行列の場合には大きい行列の型に一致します。

(2)Aがm行n列で、Bがm行1列の場合には例のような計算をします。

(3)Aがm行n列で、Bが1行n列の場合には例のような計算をします。

4/5;

0.8000

.OK.

A=|1,2,3||2,3,4|;

B=|3,2,1||3,4,5|;

.OK.

A/B;

0.3333 1.0000 3.0000

0.6667 0.7500 0.8000

.OK.

A/3;

0.3333 0.6667 1.0000

0.6667 1.0000 1.3333

.OK.

A/|1,2|';

1.0000 2.0000 3.0000

1.0000 1.5000 2.0000

.OK.

A/|1,2,3|;

1.0000 1.0000 1.0000

2.0000 1.5000 1.3333

.OK.

■ ^ ベキ乗

この演算子はベキ乗を計算します。

【例】

2^3;

8.0000

.OK.

2^0.5;

1.4142

.OK.

2^(1/2);

1.4142

.OK.

a = |1,2,3|;

.OK.

a^2;

1.0000 4.0000 9.0000

.OK.

2^a;

2.0000 4.0000 8.0000

.OK.

a^a;

1.0000 4.0000 27.0000

.OK.

a = |1,2,3|

|4,5,6|

|7,8,9|;

a^2;

1.0000 4.0000 9.0000

16.0000 25.0000 36.0000

49.0000 64.0000 81.0000

.OK.

a^|1,2,3|;

1.0000 4.0000 27.0000

4.0000 25.0000 216.0000

7.0000 64.0000 729.0000

.OK.

a^|1,2,3|';

1.0000 2.0000 3.0000

16.0000 25.0000 36.0000

343.0000 512.0000 729.0000

.OK.

b = |1,2,3|';

.OK.

b^|1,1,2,2,3,3|;

MatrixSize[3,6]

1.0000 1.0000 1.0000 1.0000 1.0000 -> [1]

2.0000 2.0000 4.0000 4.0000 8.0000 -> [1]

3.0000 3.0000 9.0000 9.0000 27.0000 -> [1]

.OK.

b^b';

1.0000 1.0000 1.0000

2.0000 4.0000 8.0000

3.0000 9.0000 27.0000

.OK.

(b')^b;

1.0000 2.0000 3.0000

1.0000 4.0000 9.0000

1.0000 8.0000 27.0000

.OK.

■ !階乗

この演算子は単項演算子で階乗を計算します。

x=series(0,5,1);

x!;

1.0000

1.0000

2.0000

6.0000

24.0000

120.0000

.OK.

■ '転置行列

 この演算子は単項演算子で転置行列を返します。プライム記号 ' で目立たないので注意してください。

x=|1,2,3||4,5,6||7,8,9||3,2,1|;

x;

1.0000 2.0000 3.0000

4.0000 5.0000 6.0000

7.0000 8.0000 9.0000

3.0000 2.0000 1.0000

.OK.

x';

1.0000 4.0000 7.0000 3.0000

2.0000 5.0000 8.0000 2.0000

3.0000 6.0000 9.0000 1.0000

.OK.

■ >,>=,==,<=,<,<> 関係演算子

 この関係演算子は行列まで拡張しています。また普通の式中に使うことができるので画像処理によく使われます。また文字列どうしの関係についても可能となっています。

A> B : A is grater than B

A>=B : A is grater than equal to B

A==B : A is equal to B

A<=B : A is less than equal to B

A< B : A is less than B

A<>B : A is not B

【注意】

 論理演算子、関係演算子は普通の計算式中で利用できるため、論理演算子、関係演算子の計算の優先順位を確定できないでいます。まだ利用経験が浅く、そのため将来、現在の演算子の優先順位が変更される事があります。そこで論理演算子、関係演算子を使用する場合には()を使って明確に順位を設定して下さい。

【例 】

setFormat("%g");

a=int(rand(5,5)*10);

a;

5 6 0 6 4

3 1 5 8 0

1 3 2 2 2

9 9 7 0 1

5 2 5 2 3

.OK.

a>=5;

1 1 0 1 0

0 0 1 1 0

0 0 0 0 0

1 1 1 0 0

1 0 1 0 0

.OK.

a<*>(a>=5);

5 6 0 6 0

0 0 5 8 0

0 0 0 0 0

9 9 7 0 0

5 0 5 0 0

.OK.

"2234">"1234";

1

.OK.

■ or論理和

行列データに関する論理和を返します。画像処理によく使います。

a;

5 6 0 6 4

3 1 5 8 0

1 3 2 2 2

9 9 7 0 1

5 2 5 2 3

.OK.

a<4 or a>8;

0 0 1 0 0

1 1 0 0 1

1 1 1 1 1

1 1 0 1 1

0 1 0 1 1

.OK.

■ and論理積

行列データに関する論理積を返します。画像処理によく使います。

a;

5 6 0 6 4

3 1 5 8 0

1 3 2 2 2

9 9 7 0 1

5 2 5 2 3

.OK.

a>3 and aa<7;

0 0 1 0 0

0 0 0 0 0

0 0 0 0 0

1 0 1 0 0

.OK.

1 1 0 1 1

■ 文字列の加算(結合)

演算子 + は文字列の結合処理を行います

【備考】

文字列の処理はファイル操作に多用されます。特にファイル名の編集によく使います。

● 例

"abcdef" + "123456";

abcdef123456

.OK.

■ 文字列の減算

演算子 - は文字列の減算処理を行います。 a$ - b$ の場合、文字列 a$ の中で b$ が見つかった位置までの文字列を返します。

【備考】

文字列の処理はファイル操作に多用されます。特にファイル名の編集によく使います。

【例】

"123456789" - "678";

12345

.OK.

"123456789" - "345";

12

.OK.

■ 文字列の

演算子 / は文字列の除算処理を行います。

a$ / b$ の場合、文字列 a$ の中で b$ の文字列を取り除きます。

【備考】

文字列の処理はファイル操作に多用されます。特にファイル名の編集によく使います。

"123456789" / "678";

123459

.OK.

【注意】

左から最初に見つかった文字列を削除します。もし文字列の2個所に対象の文字列があった場合には最も左の文字列を削除し残りはそのままです。

"126783456789" / "678";

123456789

.OK.

■PICT四則計算(カラーデータ)

 PICT 変数の四則計算ができます。ただし演算結果の数値は0から255の範囲で0以下は0に、255以上は強制的に255にされます。

【書式】

PICT変数を a#,b#,c# とします。また通常の数値を c とします。

cは正の数値でなければなりません。

b# = a# + c;

b# = a# - c;

b# = a# * c;

b# = a# / c;

 これらの演算は画像をcの数値で四則演算します。cが1行1列の数値データの場合、RGBすべて同じ値で演算されます。またcが1行3列の行列の場合には行列の左から順にRGBとして各RGBを演算します。乗算および除算では色データを100倍してから演算を行い再度100で除算した結果を用いています。

【例】

a=rand(5,5);

a=hokan(a,100,100);

a#=densityPlot(a);

b# = a#+50;b#;

b# = a#-50;b#;

.OK.

R# = a# * |1,0,0|;

G# = a# * |0,1,0|;

B# = a# * |0,0,1|;

b1# = addP(a#,R#);

b2# = addP(G#,B#);

b# = cat(b1#,b2#);

b#;

.OK.

【書式】

c# = a# + b#;

c# = a# - b#;

これは PICT 変数どうしの加減算です。

ただし画像の大きさが等しくなければ実行しません。

【例-1】

a=rand(5,5);a=hokan(a,100,100);

b=rand(5,5);b=hokan(b,100,100);

c=rand(5,5);c=hokan(c,100,100);

RGB = popRGBColor("r");

a# = densityPlot(a);

RGB = popRGBColor("g");

b# = densityPlot(b);

RGB = popRGBColor("b");

c# = densityPlot(c);

cat(addP(a#,b#),addP(c#,a#+b#+c#));

.OK.

【例-2】

x = series(-3,3,0.1); y = 1/(1+x^2);

form = |-3,3,1,-1,1,0.5|;

a#= parametricLinePlot(x,y,form);

t = series(-π,π,π/50);

x = cos(t); y = sin(3*t)/2;

b#= parametricPointPlot(x,y,form);

a#/2 + b#/|1,2,2|;

.OK.