16.3 Special Utility Matrices

Last-modified: 2025-03-30 (日) 20:09:42

16.3 特殊ユーティリティ行列

: I = eye (n)

: I = eye (m, n)

: I = eye ([m n])

: I = eye (…, class)

単位行列を返します。

単一のスカラー引数nで呼び出された場合は、正方 NxN 単位行列を返します。

2 つのスカラー引数 ( m、n ) が指定された場合は、eyeそれらを行数と列数と見なします。2 つの要素を持つベクトルが指定された場合は、 eye要素の値をそれぞれ行数と列数として使用します。例:

eye (3)
⇒  1  0  0
    0  1  0
    0  0  1

次の式はすべて同じ結果を生成します。

eye (2)
≡
eye (2, 2)
≡
eye (size ([1, 2; 3, 4]))

オプションの引数class は、eye指定された型の配列を返すことができます。

val = zeros (n,m, "uint8")

引数なしで呼び出すことはeye、引数 1 を指定して呼び出すことと同じです。負の次元はすべてゼロとして扱われます。これらの奇妙な定義は、MATLABとの互換性のためです。

See also: speye, ones, zeros.

: val = ones (n)

: val = ones (m, n)

: val = ones (m, n, k, …)

: val = ones ([m n …])

: val = ones (…, "like", var)

: val = ones (…, class)

要素がすべて 1 である行列または N 次元配列を返します。

単一のスカラー整数引数nで呼び出された場合は、正方 NxN 行列を返します。

2 つ以上のスカラー整数引数、または整数値のベクトルで呼び出された場合は、指定された次元の配列を返します。

値がすべて同じ定数行列を作成するには、次のような式を使用します。

val_matrix = val * 1 (m, n)

の後に変数varが指定された場合"like"、出力val はvar と同じデータ型、複雑度、およびスパース性を持ちます。

オプションの引数class は、返される配列のクラスを指定し、デフォルトは double です。例:

val = ones (m,n, "uint8")

See also: zeros.

: val = zeros (n)

: val = zeros (m, n)

: val = zeros (m, n, k, …)

: val = zeros ([m n …])

: val = zeros (…, "like", var)

: val = zeros (…, class)

すべての要素が 0 である行列または N 次元配列を返します。

単一のスカラー整数引数で呼び出された場合は、NxN の正方行列を返します。

2 つ以上のスカラー整数引数、または整数値のベクトルで呼び出された場合は、指定された次元の配列を返します。

の後に変数varが指定された場合"like"、出力val はvar と同じデータ型、複雑度、およびスパース性を持ちます。

オプションの引数class は、返される配列のクラスを指定し、デフォルトは double です。例:

val = zeros (m,n, "uint8")

See also: ones.

: B = repmat (A, m)

: B = repmat (A, m, n)

: B = repmat (A, m, n, p …)

: B = repmat (A, [m n])

: B = repmat (A, [m n p …])

繰り返しマトリックスまたは ND 配列。

各要素として 行列Aのコピーを持つ、 サイズm × nのブロック行列を形成します。

nが指定されていない場合は、m行m列のブロック行列を形成します。 2 次元以上にわたってコピーする場合は、2 番目の引数のベクトルで 各次元m、n、p 、… にわたってコピーする回数を指定します。

See also: bsxfun, kron, repelems.

: y = repelems (x, r)

xから繰り返し要素のベクトルを構築します。

r は、どの要素を繰り返すか、また各要素をどのくらいの頻度で繰り返すかを指定する 2x N整数行列です。最初の行のエントリr (1,j) は、繰り返す要素を選択します。2 番目の行の対応するエントリr (2,j) は、繰り返し回数を指定します。x が行列の場合、選択インデックスの目的で、 xの列は互いに積み重ねられているものとみなされます。行ベクトルは常に返されます。

概念的には、結果は次のように計算されます。

y = [];
for i = 1:columns (r)
 y = [y, x(r(1,i)*ones(1, r(2,i)))];
endfor

See also: repmat, cat.

: xxx = repelem (x, R)

: xxx = repelem (x, R_1, …, R_n)

xから繰り返し要素の配列を構築し、命令R_1、… を繰り返します。

x はスカラー、ベクトル、または N 次元配列である必要があります。

繰り返し命令R_j は、スカラーまたはベクトルのいずれかである必要があります。命令がスカラーの場合、次元jのxの各コンポーネントはR_j回 繰り返されます。命令がベクトルの場合、 x の 対応する次元jと同じ数の要素を持つ必要があります。この場合、次元jのk番目のコンポーネントが R_j 回繰り返されます。 R_j(k)

xがスカラーまたはベクトルの場合、repelem単一の繰り返し命令Rで呼び出すことができ、repelem入力と同じ方向のベクトルを返します。

xが行列の場合、少なくとも 2 つのR_jを指定する必要があります。

注:repelemベクトルxとR_jのベクトルを使用することは 、ランレングス復号化と同等です。

A = [1 2 3 4 5];
B = [2 1 0 1 2];
repelem (A, B)
 ⇒   1   1   2   4   5   5
A = magic (3)
 ⇒ A =
      8   1   6
      3   5   7
      4   9   2
B1 = [1 2 3];
B2 = 2;
repelem (A, B1, B2)
 ⇒     8   8   1   1   6   6
        3   3   5   5   7   7
        3   3   5   5   7   7
        4   4   9   9   2   2
        4   4   9   9   2   2
        4   4   9   9   2   2

xの次元数よりも多くのR_jを指定できます。余分なR_j はスカラーである必要があり (それらの次元でのxのサイズは 1 のみであるため)、それに応じてそれらの次元でxが複製されます。

A = [1 2 3 4 5];
B1 = 2;
B2 = [2 1 3 0 2];
B3 = 3;
repelem (A, B1, B2, B3)
 ⇒    ans(:,:,1) =
          1   1   2   3   3   3   5   5
          1   1   2   3   3   3   5   5
       ans(:,:,2) =
          1   1   2   3   3   3   5   5
          1   1   2   3   3   3   5   5
       ans(:,:,3) =
          1   1   2   3   3   3   5   5
          1   1   2   3   3   3   5   5

R_j は順番に指定する必要があります。複製を必要としないディメンションにはプレースホルダ 1 を使用できます。

repelem ([-1, 0; 0, 1], 1, 2, 1, 2)
 ⇒  ans(:,:,1,1) =
       -1  -1   0   0
        0   0   1   1
     ans(:,:,1,2) =
       -1  -1   0   0
        0   0   1   1

xの次元数よりも少ないR_jが指定された場合、 それらの次元のR_jは 1 であると想定されます。 repelem

A = cat (3, [-1 0; 0 1], [-1 0; 0 1])
 ⇒  ans(:,:,1) =
       -1   0
        0   1
     ans(:,:,2) =
       -1   0
        0   1
repelem (A,2,3)
 ⇒  ans(:,:,1) =
       -1  -1  -1   0   0   0
       -1  -1  -1   0   0   0
        0   0   0   1   1   1
        0   0   0   1   1   1
     ans(:,:,2) =
       -1  -1  -1   0   0   0
       -1  -1  -1   0   0   0
        0   0   0   1   1   1
        0   0   0   1   1   1

repelemxのクラスを保持し、文字列、セル配列、NA、NAN 入力で動作します。R_j のいずれかが 0 の場合、出力は空の配列になります。

repelem ("Octave", 2, 3)
 ⇒    OOOccctttaaavvveee
       OOOccctttaaavvveee
repelem ([1 2 3; 1 2 3], 2, 0)
 ⇒    [](4x0)

See also: cat, kron, repmat.

関数とを使用するlinspaceと、logspace等間隔または対数間隔の要素を持つベクトルを簡単に作成できます。範囲を参照してください。

: y = linspace (start, end)

: y = linspace (start, end, n)

start とendの間にn 個の線形間隔の要素を持つ行ベクトルを返します。

要素の数nが 1 より大きい場合、エンドポイント startとend は常に範囲に含まれます。startがendより大きい場合、要素は降順で格納されます。ポイントの数nが指定されていない場合は、値 100 が使用されます。

この関数は、 startと end のlinspace両方がスカラーの場合、行ベクトルを返します。一方または両方の入力がベクトルの場合、 それらを列ベクトルに変換し、各行が から までの独立したシーケンスである行列を返します 。 linspacestart(row_n), end(row_n)

プログラミング ノート: MATLABとの互換性のため、単一の値 ( n = 1) が要求された 場合は2 番目の引数 ( end ) を返します。nが整数でない場合は、要素の数を丸めるために使用されます。n が 0 または負の場合は、空の 1x0 行列が返されます。 floor (n)

See also: colon, logspace.

: y = logspace (a, b)

: y = logspace (a, b, n)

: y = logspace (a, pi)

: y = logspace (a, pi, n)

10^ aから10^ bまでの対数的に間隔を置いたn要素を持つ行ベクトルを返します。

要素数nが指定されていない場合は、デフォルトで 50 になります。

bが pi に等しい場合、点は 10^ aと 10^pi の間ではなく、10 ^ aと pi の間になります。これはデジタル信号処理に役立ちます。

プログラミング ノート: MATLABとの互換性のため、単一の値 ( n = 1) が要求された場合は、範囲の右側 (10^ b ) を返します。nが整数でない場合は、要素の数を丸めるために使用されます。n が 0 または負の場合は、空の 1x0 行列が返されます。 floor (n)

See also: linspace.

: x = rand (n)

: x = rand (m, n, …)

: x = rand ([m n …])

: x = rand (…, "single")

: x = rand (…, "double")

: v = rand ("state")

: rand ("state", v)

: rand ("state", "reset")

: v = rand ("seed")

: rand ("seed", v)

: rand ("seed", "reset")

区間 (0, 1) に均一に分布したランダム要素を持つ行列を返します。

引数は の引数と同じように処理されますeye。

乱数ジェネレータの状態を問い合わせるには、次のフォームを使用します。

v = rand ("状態")

これは長さ625の列ベクトルvを返します。後で、次の形式を使用して 乱数ジェネレータを状態vに復元できます。

rand ("状態", v)

また、 vの長さが 625 以下の任意のベクトルから状態ベクトルを初期化することもできます。この新しい状態は、 v自体ではなく、vの値に基づくハッシュになります 。

デフォルトでは、ジェネレータは、ウォールクロック時間、CPU 時間、現在の秒数、プロセス ID、および利用可能な場合は最大 1024 ビットの C++ 乱数ソースからのエントロピーを提供することによって初期化されます random_device。これは非決定的である可能性があります (実装固有)。これは、起動時に常に同じ状態に初期化する MATLABとは異なることに注意してください。MATLABと同等の動作を得るには、Octave のスタートアップ ファイルで決定的な状態ベクトルを使用して初期化します (スタートアップ ファイルを参照)。

疑似乱数シーケンスを計算するために、周期が2^{19937}-1randの Mersenne Twister を使用します (M. Matsumoto および T. Nishimura、「 Mersenne Twister: A 623-dimensionally equidistributed universe pseudorandom number generator」、ACM Trans. on Modeling and Computer Simulation Vol. 8, No. 1、pp. 3–30、1998 年 1 月、 http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.htmlを参照)。複数の返された値を安全にハッシュせずに暗号化に使用しないでください。そうしないと、624 個の連続した値を読み取った後にジェネレータの状態を知ることができます。

Octaveの古いバージョンでは、異なる乱数生成器が使用されていました。新しい生成器は、古い生成器よりも大幅に高速で、大幅に長いサイクル時間で乱数を生成するため、デフォルトで使用されます。ただし、状況によっては、古い生成器によって生成されたのと同じ乱数シーケンスを取得することが望ましい場合があります。これを行うには、キーワードを使用"seed"して、古い生成器を使用するように指定します 。

rand ("seed", val)

これはジェネレータのシードをvalに設定します。ジェネレータのシードは次のようにして取得できます。

s = rand ("seed")

ただし、シードを照会しても rand古いジェネレータは使用されず、シードを設定する場合にのみ使用されることに注意してください。 randで再び新しいジェネレータを使用するには、 キーワード "state"を使用して の状態をリセットする必要がありますrand。

キーワードを使用して、ジェネレーターの状態またはシードを新しいランダム値にリセットできます"reset"。

返される値のクラスは、末尾の "double"または"single"引数によって制御できます。これらは、有効なクラスのみです。

See also: randn, rande, randg, randp.

: R = randi (imax)

: R = randi (imax, n)

: R = randi (imax, m, n, …)

: R = randi ([imin imax], …)

: R = randi (…, "class")

1: imaxの範囲のランダムな整数を返します。

追加の引数によって、返される行列の形状が決まります。引数が指定されていない場合は、単一のランダムな整数が返されます。引数nが 1 つ指定されている場合は、正方行列 ( n x n ) が返されます。引数が 2 つ以上指定されている場合は、多次元行列 ( m x n x …)が返されます。

整数範囲は、オプションで下限と上限を持つ 2 要素の行列で記述できます。その場合、返される整数は [ imin、 imax ] の区間上にあります。

オプションの引数class は、要求されたタイプの行列を返します。デフォルトは です"double"。

次の例では、1 ~ 10 の範囲の整数 150 個を返します。

ri = randi (10, 150, 1)

実装上の注意:は、数値を表すためにクラスを使用するrandiに内部的に依存します。これにより、最大整数 ( imax ) と範囲 ( imax - imin ) が関数によって返される値に制限されます。IEEE 浮動小数点数の場合、この値は2^{53} - 1です。 rand"double"flintmax

See also: rand, randn.

: x = randn (n)

: x = randn (m, n, …)

: x = randn ([m n …])

: x = randn (…, "single")

: x = randn (…, "double")

: v = randn ("state")

: randn ("state", v)

: randn ("state", "reset")

: v = randn ("seed")

: randn ("seed", v)

: randn ("seed", "reset")

平均が 0、分散が 1 の正規分布したランダム要素を持つ行列を返します。

引数は の引数と同じように処理されますrand。

デフォルトでは、randnMarsaglia と Tsang の「Ziggurat テクニック」を使用して、均一分布から正規分布に変換します。

返される値のクラスは、末尾の "double"または"single"引数によって制御できます。これらは、有効なクラスのみです。

参考文献: G. Marsaglia および WW Tsang、 「ランダム変数を生成するためのジグラット法」、J. Statistical Software、vol 5、2000 年、 https://www.jstatsoft.org/v05/i08/

See also: rand, rande, randg, randp.

: x = rande (n)

: x = rande (m, n, …)

: x = rande ([m n …])

: x = rande (…, "single")

: x = rande (…, "double")

: v = rande ("state")

: rande ("state", v)

: rande ("state", "reset")

: v = rande ("seed")

: rande ("seed", v)

: rande ("seed", "reset")

指数分布のランダム要素を持つ行列を返します。

引数は の引数と同じように処理されますrand。

デフォルトでは、randeMarsaglia と Tsang の「Ziggurat テクニック」を使用して、均一分布から指数分布に変換します。

返される値のクラスは、末尾の "double"または"single"引数によって制御できます。これらは、有効なクラスのみです。

参考文献: G. Marsaglia および WW Tsang、 「ランダム変数を生成するためのジグラット法」、J. Statistical Software、vol 5、2000 年、 https://www.jstatsoft.org/v05/i08/

See also: rand, randn, randg, randp.

: x = randp (l, n)

: x = randp (l, m, n, …)

: x = randp (l, [m n …])

: x = randp (…, "single")

: x = randp (…, "double")

: v = randp ("state")

: randp ("state", v)

: randp ("state", "reset")

: v = randp ("seed")

: randp ("seed", v)

: randp ("seed", "reset")

最初の引数lで指定された平均値パラメータを持つポアソン分布のランダム要素を持つ行列を返します。

rand引数は、引数lを除いて、 の引数と同じように処理されます。

lの範囲とlがスカラーか行列 かに応じて、5 つの異なるアルゴリズムが使用されます。

スカラーl ≤ 12 の場合は直接法を使用します。
WH Press 他著『Numerical Recipes in C』、ケンブリッジ大学出版局、1992 年。

スカラーl > 12の場合は拒否法を使用する。[1]
WH Press 他著『Numerical Recipes in C』、ケンブリッジ大学出版局、1992 年。

行列l≤10の場合は反転法を使用する。[2]
E. Stadlober 他、WinRand ソース コード、FTP 経由で入手可能。

行列l > 10 の場合は、パッチワーク拒否法を使用します。
E. Stadlober 他著、WinRand ソース コード (FTP 経由で入手可能)、または H. Zechner 著、「連続および離散単峰分布からの効率的なサンプリング」、博士論文、156 ページ、Technical University Graz、オーストリア、1994 年。

l > 1e8の場合は、正規近似を使用します。
L. Montanet 他「粒子特性レビュー」、Physical Review D 50 p1284、1994 年。

返される値のクラスは、末尾の "double"または"single"引数によって制御できます。これらは、有効なクラスのみです。

See also: rand, randn, rande, randg.

: x = randg (a, n)

: x = randg (a, m, n, …)

: x = randg (a, [m n …])

: x = randg (…, "single")

: x = randg (…, "double")

: v = randg ("state")

: randg ("state", v)

: randg ("state", "reset")

: v = randg ("seed")

: randg ("seed", v)

: randg ("seed", "reset")

分散されたランダム要素を持つ行列を返します。 gamma (a,1)

rand引数は、引数aを除いて、 の引数と同じように処理されます。

これを使用して、さまざまな分布を生成できます。

gamma (a, b) for a > -1, b > 0
r = b * randg (a)
beta (a, b) for a > -1, b > -1
r1 = randg (a, 1)
r = r1 / (r1 + randg (b, 1))
Erlang (a, n)
r = a * randg (n)
chisq (df) for df > 0
r = 2 * randg (df / 2)
t (df) for 0 < df < inf (use randn if df is infinite)
r = randn () / sqrt (2 * randg (df / 2) / df)
F (n1, n2) for 0 < n1, 0 < n2
## r1 equals 1 if n1 is infinite
r1 = 2 * randg (n1 / 2) / n1
## r2 equals 1 if n2 is infinite
r2 = 2 * randg (n2 / 2) / n2
r = r1 / r2
negative binomial (n, p) for n > 0, 0 < p <= 1
r = randp *1
non-central chisq (df, L), for df >= 0 and L > 0
(use chisq if L = 0)
r = randp (L / 2)
r(r > 0) = 2 * randg (r(r > 0))
r(df > 0) += 2 * randg (df(df > 0)/2)
Dirichlet (a1, … ak)
r = (randg (a1), ..., randg (ak))
r = r / sum (r)

返される値のクラスは、末尾の "double"または"single"引数によって制御できます。これらは、有効なクラスのみです。

See also: rand, randn, rande, randp.

: rng (seed)

: rng (seed, "generator")

: rng ("shuffle")

: rng ("shuffle", "generator")

: rng ("default")

: s = rng ()

: rng (s)

: s = rng (…)

randおよび で使用される乱数ジェネレータのシードを設定または照会しますrandn。

入力シードは、乱数ジェネレーターの状態ベクトルを初期化するために使用されるスカラー数値です。

オプションの文字列ジェネレータは、使用する乱数ジェネレータのタイプを指定します。その値は"twister"、、 "v5uniform"またはのいずれかです"v5normal"。"twister"キーワードについては後述します。 "v5uniform"およびは、"v5normal"異なる乱数ジェネレータを使用していた Octave の古いバージョンを参照します。

乱数ジェネレーターの状態またはシードは、"shuffle"キーワードを使用して新しいランダム値にリセットできます。

乱数ジェネレーターは、 "default"キーワードを使用してデフォルト値にリセットできます。デフォルト値は、シード 0 の Mersenne Twister ジェネレーターを使用することです。

オプションの戻り値sには、関数が呼び出された時点(つまり、入力引数に応じて変更される前)の乱数ジェネレータの状態が含まれます。これは、、、の 3 つのフィールドを持つ構造体変数としてエンコードされます。"Type"乱数"Seed"ジェネレータ "State"は、 を使用して状態sに復元できます。これは、アルゴリズムに疑似乱数の同一シーケンスが必要な場合に便利です。 rng (s)

デフォルトおよびオプションでは、周期が2^{19937}-1"twister"の Mersenne Twister を使用して疑似乱数シーケンスが計算されます (M. Matsumoto および T. Nishimura、「 Mersenne Twister: A 623-dimensionally equidistributed universe pseudorandom number generator」、ACM Trans. on Modeling and Computer Simulation Vol. 8, No. 1、pp. 3–30、1998 年 1 月、 http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.htmlを参照)。複数の返された値を安全にハッシュせずに暗号化に使用しないでください。そうしないと、624 個の連続した値を読み取った後にジェネレータの状態を知ることができます。

See also: rand, randn.

ジェネレーターは、新しいスタイルまたは古いスタイルで一緒に動作します。2 つを混在させることはできません。 "state"またはを使用していずれかのジェネレーターを初期化すると"seed"、今後の呼び出しで他のジェネレーターが同じスタイルに切り替わります。

各ジェネレータの状態は独立しており、異なるジェネレータの呼び出しは最終結果に影響を与えることなく交互に実行できます。たとえば、

rand ("state", [11, 22, 33]);
randn ("state", [44, 55, 66]);
u = rand (100, 1);
n = randn (100, 1);

そして

rand ("state", [11, 22, 33]);
randn ("state", [44, 55, 66]);
u = zeros (100, 1);
n = zeros (100, 1);
for i = 1:100
 u(i) = rand ();
 n(i) = randn ();
end

は同等の結果を生成します。ジェネレーターが と"seed"のみを使用して古いスタイルで初期化される場合rand、randn古いrande、randgおよび ジェネレーターはおよびrandpを呼び出すため、 は独立しています。 randrandn

ジェネレータは起動時にランダムな状態で初期化されるため、乱数のシーケンスは Octave を実行するたびに同じではありません。7数値のシーケンスを正確に再現する必要がある場合は、状態またはシードを特定の値に設定できます。

引数なしで呼び出された場合は、randランダムrandnなシーケンスの単一の要素を返します。

オリジナルrandおよびrandn関数は、 テキサス大学MDアンダーソンがんセンター、ヒューストン、TX 77030の生物数学部のBarry W. BrownとJames Lovatoによってコンパイルされた、乱数生成用のFortranルーチンのライブラリであるRANLIBのFortranコードを使用します。

: v = randperm (n)

: v = randperm (n, m)

1:nのランダムな順列を含む行ベクトルを返します。

mが指定されている場合は、から置換なしでサンプリングされたm個の一意のエントリを返します。 1:n

複雑さは、メモリに関してはO( n )、時間に関しては O( m ) です。ただし、 m < n /5 の場合は、O( m ) のメモリも使用されます。ランダム化は rand() を使用して実行されます。すべての順列は、同じ確率で発生します。

See also: perms.

脚注
(7)
randおよびの古いバージョンは、randn システム クロックから初期シードを取得します。