Main Content

pagemtimes

ページ単位の行列の乗算

説明

Z = pagemtimes(X,Y) は、N 次元配列 XY の対応するページの行列積を計算します。出力配列 Z の各ページは、Z(:,:,i) = X(:,:,i)*Y(:,:,i) の積によって与えられます。

  • X または Y のいずれかが行列である場合、pagemtimes はそれを他の入力の各ページと乗算します。たとえば、X が行列の場合、Z(:,:,i) = X*Y(:,:,i) です。

  • X および Y が 3 次元より大きい場合、最初の 2 次元を超える次元はすべて互換性のあるサイズでなければなりません。pagemtimes は、余分な次元を暗黙的に拡張し、Z(:,:,i,j,k) = Xx(:,:,i,j,k)*Yy(:,:,i,j,k) のように、ページ付き行列のすべての組み合わせを乗算します (余分な次元は Xx および Yy で拡張されています)。

Z = pagemtimes(X,transpX,Y,transpY) は、X および Y の指定された転置を使用して、必要に応じて行列積を計算します。この構文では、両方の転置オプションを指定しなければなりません。transpX および transpY はそれぞれ 'transpose''ctranspose'、または 'none' でなければなりません。

すべて折りたたむ

3 次元配列を 2 つ作成し、対応するページを乗算します。

rng default
X = randi([1 6],2,2,3)
X = 
X(:,:,1) =

     5     1
     6     6


X(:,:,2) =

     4     2
     1     4


X(:,:,3) =

     6     1
     6     6

Y = randi([1 6],2,2,3)
Y = 
Y(:,:,1) =

     6     5
     3     1


Y(:,:,2) =

     3     5
     6     6


Y(:,:,3) =

     4     6
     1     6

Z = pagemtimes(X,Y)
Z = 
Z(:,:,1) =

    33    26
    54    36


Z(:,:,2) =

    24    32
    27    29


Z(:,:,3) =

    25    42
    30    72

出力 Z(:,:,i)i 番目のページは X(:,:,i)*Y(:,:,i) を乗算することで得られます。

行列 A と 3 次元配列 Y を作成し、3 次元配列の各ページと行列を乗算します。

A = magic(3)
A = 3×3

     8     1     6
     3     5     7
     4     9     2

rng default
Y = randi([1 10],3,3,3)
Y = 
Y(:,:,1) =

     9    10     3
    10     7     6
     2     1    10


Y(:,:,2) =

    10    10     2
     2     5     5
    10     9    10


Y(:,:,3) =

     8     1     7
    10     9     8
     7    10     8

Z = pagemtimes(A,Y)
Z = 
Z(:,:,1) =

    94    93    90
    91    72   109
   130   105    86


Z(:,:,2) =

   142   139    81
   110   118   101
    78   103    73


Z(:,:,3) =

   116    77   112
   123   118   117
   136   105   116

出力 Z(:,:,i)i 番目のページは A*Y(:,:,i) を乗算することで得られます。

2 つの 3 次元配列 X および Y を作成します。pagemtimes を使用して、X および Y の各ページに対して演算 X(:,:,i)'*Y(:,:,i) を実行します。

rng default
X = rand(3,3,3) + 1i;
Y = rand(3,3,3);
A = pagemtimes(X,'ctranspose',Y,'none')
A = 
A(:,:,1) =

   0.9350 - 1.2189i   0.6392 - 1.0148i   0.2302 - 0.9668i
   0.7894 - 1.2189i   0.6920 - 1.0148i   0.1839 - 0.9668i
   0.6316 - 1.2189i   0.4792 - 1.0148i   0.8544 - 0.9668i


A(:,:,2) =

   1.6427 - 1.9622i   0.4727 - 0.8547i   1.0453 - 1.7476i
   1.5794 - 1.9622i   0.5513 - 0.8547i   1.2682 - 1.7476i
   1.1025 - 1.9622i   0.5393 - 0.8547i   0.6151 - 1.7476i


A(:,:,3) =

   1.2393 - 1.5817i   1.4671 - 1.7401i   1.2737 - 1.4974i
   0.9995 - 1.5817i   0.9240 - 1.7401i   0.7324 - 1.4974i
   1.1504 - 1.5817i   1.2585 - 1.7401i   1.0786 - 1.4974i

次に、X および Y の各ページに対して演算 X(:,:,i)*Y(:,:,i).' を実行します。

B = pagemtimes(X,'none',Y,'transpose')
B = 
B(:,:,1) =

   0.9773 + 1.1444i   0.5902 + 0.7844i   0.6217 + 1.2716i
   0.8270 + 1.1444i   0.6670 + 0.7844i   0.7805 + 1.2716i
   0.1629 + 1.1444i   0.1793 + 0.7844i   0.8372 + 1.2716i


B(:,:,2) =

   0.8120 + 1.4948i   0.8387 + 1.5510i   1.3086 + 1.5187i
   0.4491 + 1.4948i   0.5983 + 1.5510i   0.4138 + 1.5187i
   1.4030 + 1.4948i   1.3871 + 1.5510i   1.3988 + 1.5187i


B(:,:,3) =

   0.8747 + 1.8788i   0.8246 + 1.8554i   0.6322 + 1.0849i
   1.5873 + 1.8788i   1.5648 + 1.8554i   0.9777 + 1.0849i
   1.4888 + 1.8788i   1.4839 + 1.8554i   0.8025 + 1.0849i

3 x 3 x 2 の配列 X を作成し、それを 3 x 3 x 1 x 4 の配列 Y と乗算します。結果のサイズは 3 x 3 x 2 x 4 です。

X = ones(3,3,2);
A = eye(3);
Y = cat(4,A,2*A,3*A,4*A);
Z = pagemtimes(X,Y)
Z = 
Z(:,:,1,1) =

     1     1     1
     1     1     1
     1     1     1


Z(:,:,2,1) =

     1     1     1
     1     1     1
     1     1     1


Z(:,:,1,2) =

     2     2     2
     2     2     2
     2     2     2


Z(:,:,2,2) =

     2     2     2
     2     2     2
     2     2     2


Z(:,:,1,3) =

     3     3     3
     3     3     3
     3     3     3


Z(:,:,2,3) =

     3     3     3
     3     3     3
     3     3     3


Z(:,:,1,4) =

     4     4     4
     4     4     4
     4     4     4


Z(:,:,2,4) =

     4     4     4
     4     4     4
     4     4     4

(最初の 2 次元に続く) サイズが 1 の各次元は、他の入力の次元サイズに一致するように暗黙的に拡張されます。その後、X(:,:,i,j)*Y(:,:,i,j) を乗算することで、出力 Z(:,:,i,j) の各ページが形成されます。この演算について直感的に考えると次のようになります。X には 3 次元配列のページとして 2 つの行列が含まれており、Y には 4 番目の次元に沿って配置された 4 つの行列が含まれています。そのため、これらの行列のすべての組み合わせを乗算することで、3 行 3 列の 8 つの行列になります。

入力引数

すべて折りたたむ

入力配列。密行列または多次元配列として指定します。XY のページは、行列積 (mtimes, *) にとって有効な入力でなければなりません。

  • X または Y のいずれかが行列である場合、pagemtimes はそれを他の入力の各ページと乗算します。たとえば、X が行列の場合、Z(:,:,i) = X*Y(:,:,i) です。

  • X および Y が 3 次元より大きい場合、最初の 2 次元を超える次元はすべて互換性のあるサイズでなければなりません。pagemtimes は、余分な次元を暗黙的に拡張し、Z(:,:,i,j,k) = Xx(:,:,i,j,k)*Yy(:,:,i,j,k) のように、ページ付き行列のすべての組み合わせを乗算します (余分な次元は Xx および Yy で拡張されています)。

データ型: single | double
複素数のサポート: あり

転置オプション。それぞれを次の表のいずれかの値として指定します。

説明
'none'転置を適用しません。
'transpose'対応する入力の各ページに対して転置を適用します (transpose を各ページに適用)。
'ctranspose'対応する入力の各ページに対して複素共役転置を適用します (ctranspose を各ページに適用)。

転置オプションを使用して、X'*Y などの演算をページ単位で計算します。転置されている入力が 1 つしかない場合でも、両方の転置オプションを指定しなければなりません。

例: pagemtimes(X,'ctranspose',Y,'none') はページ単位バージョンの X'*Y を計算します。

データ型: char | string

出力引数

すべて折りたたむ

出力配列。多次元配列として返されます。pagemtimes により実行される演算は、入力 X および Y のサイズによって異なります。

X のサイズY のサイズ演算

3-D

3-D

Z(:,:,i) = X(:,:,i)*Y(:,:,i)

2-D

3-D

Z(:,:,i) = X*Y(:,:,i)

3-D

2-D

Z(:,:,i) = X(:,:,i)*Y

N-D

N-D

Z(:,:,i,j,k) = X(:,:,i,j,k)*Y(:,:,i,j,k)

Z のサイズは次のルールに従います。

  • 最初の 2 次元では、行列乗算のルールが適用されます。いずれかのオペランドがスカラーである場合、結果のサイズは非スカラーのオペランドのサイズになります。オペランドがどちらも行列である場合、m 行 n 列の行列と n 行 q 列の行列を乗算すると m 行 q 列の行列になります。

  • X および Y の最初の 2 次元を超える互換性のある次元は、大きさが 1 でない次元に一致するように拡張されます。そのため、X が 10 x 8 x 1 x 3 であり、Y が 8 x 10 x 4 x 1 である場合、Z は 10 x 10 x 4 x 3 です。

詳細

すべて折りたたむ

配列ページ

pagemtimes のようなページ単位関数は、多次元配列に配置された 2 次元行列を処理します。たとえば 3-D 配列では、配列の 3 番目の次元にある要素は、本のページのようにお互いの上に積み重なるため、一般に "ページ" と呼ばれています。各ページは関数によって処理される行列です。

3-D array with several matrices stacked on top of each other as pages in the third dimension

2 次元行列の集合から、4 次元配列または 5 次元配列のような、より高い次元の配列も作成できます。この場合でも、pagemtimes は配列の基本単位を X(:,:,i,j,k,l) などの処理される 2 次元行列として扱います。

関数 cat は、行列の集合から多次元配列を作成するのに便利です。関数 zeros は、多次元配列を事前に割り当てるのに便利です。

ヒント

  • 実数の N 次元配列の場合、pagemtimes(X,'transpose',X,'none') は対称ページをもつ行列を返します。同様に、複素数の N 次元配列の場合、pagemtimes(X,'ctranspose',X,'none') を使用して対称ページを取得できます。

拡張機能

バージョン履歴

R2020b で導入