Main Content

wextend

ベクトルまたは行列の拡張

説明

YEXT= wextend(TYPE,MODE,X,LEN) は、実数値の入力ベクトルまたは入力行列 XTYPE の方法と MODE の拡張を使用して LEN の長さだけ拡張します。TYPE は拡張の次元を指定します。MODE は拡張で値を埋めるために適用するルールを指定します。

YEXT = wextend(___,LOC) では、拡張の位置も指定します。

すべて折りたたむ

ベクトルの拡張

さまざまな方法を使用してベクトルを拡張します。

ベクトルを作成し、拡張の長さを 2 に設定します。

len = 2;
x = [1 2 3]
x = 1×3

     1     2     3

ゼロ パディング拡張を実行します。異なる形式の入力引数にも対応できることを確認するために、この拡張を 2 回実行します。どちらの場合も結果は同じになります。

xextzpd1 = wextend('1','zpd',x,len)
xextzpd1 = 1×7

     0     0     1     2     3     0     0

xextzpd2 = wextend('1D','zpd',x,len,'b')
xextzpd2 = 1×7

     0     0     1     2     3     0     0

半分の点の対称拡張を実行します。

xextsym = wextend('1D','sym',x,len)
xextsym = 1×7

     2     1     1     2     3     3     2

周期的拡張を実行します。入力ベクトルの長さが奇数であるため、wextend は追加サンプルを末尾に追加してから 'ppd' モードを使用して拡張を行います。このサンプルは右側の最後の値と等しくなります。

xextper = wextend('1D','per',x,len)
xextper = 1×8

     3     3     1     2     3     3     1     2

行列の拡張

さまざまな方法を使用して小さな行列を拡張します。

行列を作成し、拡張の長さを 2 に設定します。

len = 2;
X = [1 2 3; 4 5 6]
X = 2×3

     1     2     3
     4     5     6

配列のゼロ パディング拡張を実行します。

Xextzpd = wextend(2,'zpd',X,len)
Xextzpd = 6×7

     0     0     0     0     0     0     0
     0     0     0     0     0     0     0
     0     0     1     2     3     0     0
     0     0     4     5     6     0     0
     0     0     0     0     0     0     0
     0     0     0     0     0     0     0

配列の半分の点の対称拡張を実行します。

Xextsym = wextend('2D','sym',X,len)
Xextsym = 6×7

     5     4     4     5     6     6     5
     2     1     1     2     3     3     2
     2     1     1     2     3     3     2
     5     4     4     5     6     6     5
     5     4     4     5     6     6     5
     2     1     1     2     3     3     2

値がデータ型の範囲の限界値に達しているか限界値に近い状態で、uint8 のベクトルに対して対称拡張、反対称拡張、および平滑化拡張を実行して影響を観察します。

対称拡張

uint8 の整数の最小値は 0 で最大値は 255 です。それらの限界値を含む uint8 の整数のベクトルを作成します。

dataVector = uint8([0 1 2 253 254 255])
dataVector = 1x6 uint8 row vector

     0     1     2   253   254   255

ベクトルの全点および半分の点の対称拡張を求めます。ベクトルの値を左右に 2 つずつ拡張します。

wholePointSym = wextend('1','symw',dataVector,2)
wholePointSym = 1x10 uint8 row vector

     2     1     0     1     2   253   254   255   254   253

halfPointSym = wextend('1','symh',dataVector,2)
halfPointSym = 1x10 uint8 row vector

     1     0     0     1     2   253   254   255   255   254

対称的に拡張した場合、値が uint8 の範囲を超えることはありません。

反対称拡張

ベクトルの double 型のコピーを作成し、そのコピーの全点の反対称拡張を求めます。この拡張には、負の値と 255 よりも大きい値が含まれます。

dataVectorDouble = double(dataVector);
wholePointAsymDouble = wextend('1','asymw',dataVectorDouble,2)
wholePointAsymDouble = 1×10

    -2    -1     0     1     2   253   254   255   256   257

元の uint8 のベクトルの全点の反対称拡張を求めます。uint8 の範囲を超える値は最も近い uint8 の整数にマッピングされます。負の値については 0、255 よりも大きい値については 255 です。

wholePointAsym = wextend('1','asymw',dataVector,2)
wholePointAsym = 1x10 uint8 row vector

     0     0     0     1     2   253   254   255   255   255

次に、double のコピーと元の uint8 のベクトルの半分の点の反対称拡張を求めます。

halfPointAsymDouble = wextend('1','asymh',dataVectorDouble,2)
halfPointAsymDouble = 1×10

    -1     0     0     1     2   253   254   255  -255  -254

halfPointAsym = wextend('1','asymh',dataVector,2)
halfPointAsym = 1x10 uint8 row vector

     0     0     0     1     2   253   254   255     0     0

全点の反対称拡張の場合と同様に、拡張された uint8 のデータに含まれる負の値は 0 にマッピングされます。

平滑化拡張

double のコピーと元の uint8 のベクトルの次数 0 の平滑化拡張を求めます。

smooth0Double = wextend('1','sp0',dataVectorDouble,2)
smooth0Double = 1×10

     0     0     0     1     2   253   254   255   255   255

smooth0 = wextend('1','sp0',dataVector,2)
smooth0 = 1x10 uint8 row vector

     0     0     0     1     2   253   254   255   255   255

結果は同一になります。次に、各ベクトルの次数 1 の平滑化拡張を求めます。

smooth1Double = wextend('1','sp1',dataVectorDouble,2)
smooth1Double = 1×10

    -2    -1     0     1     2   253   254   255   256   257

smooth1 = wextend('1','sp1',dataVector,2)
smooth1 = 1x10 uint8 row vector

     0     0     0     1     2   253   254   255   255   255

double の結果の uint8 の範囲を超える値は、uint8 の拡張では最も近い uint8 の値にマッピングされます。

値がデータ型の範囲の限界値に達しているか限界値に近い状態で、int8 のデータに対して対称拡張、反対称拡張、および平滑化拡張を実行して影響を観察します。

対称拡張

int8 の整数の最小値は -128 で最大値は 127 です。それらの限界値を含む int8 の整数のベクトルを作成します。

dataVector = int8([-128 -127 -126 125 126 127])
dataVector = 1x6 int8 row vector

   -128   -127   -126    125    126    127

データの全点および半分の点の対称拡張を求めます。ベクトルの値を左右に 2 つずつ拡張します。

wholePointSym = wextend('1','symw',dataVector,2)
wholePointSym = 1x10 int8 row vector

   -126   -127   -128   -127   -126    125    126    127    126    125

halfPointSym = wextend('1','symh',dataVector,2)
halfPointSym = 1x10 int8 row vector

   -127   -128   -128   -127   -126    125    126    127    127    126

対称的に拡張した場合、値が int8 の範囲を超えることはありません。

反対称拡張

ベクトルの double 型のコピーを作成し、そのコピーの全点の反対称拡張を求めます。この拡張には、-128 よりも小さい負の値と 127 よりも大きい値が含まれます。

dataVectorDouble = double(dataVector);
wholePointsAsymDouble = wextend('1','asymw',dataVectorDouble,2)
wholePointsAsymDouble = 1×10

  -130  -129  -128  -127  -126   125   126   127   128   129

元の int8 のベクトルの全点の反対称拡張を求めます。int8 の範囲を超える値は最も近い int8 の整数にマッピングされます。-128 よりも小さい値については -128、127 よりも大きい値については 127 です。

wholePointAsym = wextend('1','asymw',dataVector,2)
wholePointAsym = 1x10 int8 row vector

   -128   -128   -128   -127   -126    125    126    127    127    127

次に、double のコピーと元の int8 のベクトルの半分の点の反対称拡張を求めます。

halfPointAsymDouble = wextend('1','asymh',dataVectorDouble,2)
halfPointAsymDouble = 1×10

   127   128  -128  -127  -126   125   126   127  -127  -126

halfPointAsym = wextend('1','asymh',dataVector,2)
halfPointAsym = 1x10 int8 row vector

    127    127   -128   -127   -126    125    126    127   -127   -126

double の結果の最初の値は 127 であり、これは int8 の整数として表現できます。2 番目の値は 128 であり、これは int8 の整数として表現できません。したがって、int8 の結果では 127 にマッピングされます。double 型の結果の残りの値は、いずれも int8 の整数として表現できます。

平滑化拡張

double のコピーと元の int8 のベクトルの次数 0 の平滑化拡張を求めます。

smooth0Double = wextend('1','sp0',dataVectorDouble,2)
smooth0Double = 1×10

  -128  -128  -128  -127  -126   125   126   127   127   127

smooth0 = wextend('1','sp0',dataVector,2)
smooth0 = 1x10 int8 row vector

   -128   -128   -128   -127   -126    125    126    127    127    127

結果は同一になります。次に、各ベクトルの次数 1 の平滑化拡張を求めます。

smooth1Double = wextend('1','sp1',dataVectorDouble,2)
smooth1Double = 1×10

  -130  -129  -128  -127  -126   125   126   127   128   129

smooth1 = wextend('1','sp1',dataVector,2)
smooth1 = 1x10 int8 row vector

   -128   -128   -128   -127   -126    125    126    127    127    127

double の結果の int8 の範囲を超える値は、int8 の拡張では最も近い int8 の値にマッピングされます。

入力引数

すべて折りたたむ

入力で使用される拡張方法。次に示す値のいずれかとして指定します。

TYPE説明
1'1''1d'、または '1D'

1 次元拡張

2'2''2d'、または '2D'

2 次元拡張

'ar' または 'addrow'

行を追加

'ac' または 'addcol'

列を追加

データ型: double | char

入力の拡張に使用する固有の拡張方法。次に示す値のいずれかとして指定します。詳細については、dwtmode を参照してください。

MODE

説明

'zpd'

ゼロ拡張

'sp0'

次数 0 の平滑化拡張

'spd' (または 'sp1')

次数 1 の平滑化拡張

'sym' または 'symh'

対称パディング (半分の点): 境界値の対称的な複製

'symw'

対称パディング (全点): 境界値の対称的な複製

'asym' または 'asymh'

反対称パディング (半分の点): 境界値の反対称の複製

'asymw'

反対称パディング (全点): 境界値の反対称の複製

'ppd'

周期化拡張 (1)

'per'

周期化拡張 (2)

信号長が奇数の場合、wextend は最後の値のコピーを右に追加し、'ppd' モードを使用して拡張を実行します。そうでない場合、'per''ppd' に縮小します。このルールはイメージにも適用されます。

対称拡張モードの詳細については、[1]を参照してください。

メモ

拡張モード 'sp0' および 'spd' (または 'sp1') では、データを内部的に倍精度にキャストしてから拡張を実行します。整数データ型の場合、次のいずれかの状況になると wextend で警告が出力されます。

  • 倍精度への変換により、精度が低下する場合。

  • 要求された拡張により、結果の整数が倍精度の数値で連続した整数を正確に表現できる範囲を超える場合。

データ型: char

入力データ。実数値のベクトルまたは行列として指定します。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

拡張の長さ。非負の整数または非負の整数の 2 要素ベクトルとして指定します。行列を拡張する場合は LEN[LROW,LCOL] として表現します。LROW は追加する行の数、LCOL は追加する列の数です。行列の 2 次元拡張を実行する場合は、LEN を単一の整数として指定すると両方の方向に同じ量だけ拡張できます。

長さ 0 の拡張は null 拡張と等価です。

例: wextend('2D','sym',[1 2 3 4;5 6 7 8],[2 0]) は、上下に 2 行ずつだけ拡張します。

拡張の位置。次のいずれかまたはペアとして指定します。

  • 'l' — 左に拡張

  • 'u' — 上に拡張

  • 'r' — 右に拡張

  • 'd' — 下に拡張

  • 'b' — 両側を拡張

  • 'n' — Null 拡張

LOC の有効な値と既定値および LEN の動作は、指定した TYPE によって異なります。

TYPELOC
1, '1', 1d' または '1D''l''u''r''d''b'、または 'n'

例: wextend('1D','zpd',X,3,'r') は、入力ベクトル X を右に 3 要素拡張します。

既定値: 'b'

LEN は拡張の長さです。
2, '2', '2d' または '2D' [LOCROW,LOCCOL]LOCROW および LOCCOL は 1 次元拡張の位置または 'n' (なし) です。

例: wextend('2D','zpd',X,[2 3],'ub') は、入力ベクトルまたは入力行列 X を上に 2 行、両側に 3 列拡張します。

既定値: 'bb'

LEN は追加する行と列の数です。[LROW,LCOL] として指定します。
'ar' または 'addrow''l''u''r''d''b'、または 'n'

例: wextend('addrow','zpd',X,4,'d') は、入力ベクトルまたは入力行列 X を下に 4 行拡張します。

既定値: 'b'

LEN は追加する行の数です。
'ac' または 'addcol''l''u''r''d''b'、または 'n'

例: wextend('addcol','zpd',X,1,'l') は、入力ベクトルまたは入力行列 X を左に 1 列拡張します。

既定値: 'b'

LEN は追加する列の数です。

ヒント

ほとんどのウェーブレットの用途では、周期的拡張または対称拡張が効果的です。

アルゴリズム

値が入力のデータ型の範囲を超える場合、wextend はその値を入力のデータ型の最も近い値にマッピングします。データ型の範囲を超えるデータの拡張の例については、uint8 データの範囲限界値を超える拡張およびint8 データの範囲限界値を超える拡張を参照してください。

参照

[1] Strang, G., and T. Nguyen. Wavelets and Filter Banks. Wellesley, MA: Wellesley-Cambridge Press, 1996.

拡張機能

バージョン履歴

R2006a より前に導入

参考