Looking for matlab Answers? Try Ask4KnowledgeBase
Looking for matlab Keywords? Try Ask4Keywords

MATLAB LanguageMATLAB言語を使い始める


バージョン

バージョンリリース発売日
1.0 1984-01-01
2 1986-01-01
3 1987-01-01
3.5 1990-01-01
4 1992-01-01
4.2c 1994-01-01
5.0 第8巻 1996-12-01
5.1 第9巻 1997-05-01
5.1.1 R9.1 1997-05-02
5.2 R10 1998-03-01
5.2.1 R10.1 1998年03月02日
5.3 R11 1999-01-01
5.3.1 R11.1 1999-11-01
6.0 R12 2000-11-01
6.1 R12.1 2001-06-01
6.5 R13 2002-06-01
6.5.1 R13SP2 2003-01-01
6.5.2 R13SP2 2003-01-02
7 R14 2006-06-01
7.0.4 R14SP1 2004年10月1日
7.1 R14SP3 2005-08-01
7.2 R2006a 2006-03-01
7.3 R2006b 2006-09-01
7.4 R2007a 2007-03-01
7.5 R2007b 2007-09-01
7.6 R2008a 2008-03-01
7.7 R2008b 2008-09-01
7.8 R2009a 2009-03-01
7.9 R2009b 2009-09-01
7.10 R2010a 2010-03-01
7.11 R2010b 2010-09-01
7.12 R2011a 2011-03-01
7.13 R2011b 2011-09-01
7.14 R2012a 2012-03-01
8.0 R2012b 2012-09-01
8.1 R2013a 2013-03-01
8.2 R2013b 2013-09-01
8.3 R2014a 2014-03-01
8.4 R2014b 2014-09-01
8.5 R2015a 2015-03-01
8.6 R2015b 2015-09-01
9.0 R2016a 2016-03-01
9.1 R2016b 2016-09-14
9.2 R2017a 2017-03-08

関連項目: WikipediaのMATLABリリース履歴

匿名関数と関数ハンドル

基本

匿名関数は、MATLAB言語の強力なツールです。それらはローカルに存在する関数です。つまり、現在のワークスペースにあります。ただし、通常の関数(たとえばmファイル)のようにMATLABパス上に存在しません。そのため、彼らは匿名と呼ばれていますが、ワークスペースに変数のような名前を付けることができます。

@ 演算子

@ 演算子を使用して、無名関数と関数ハンドルを作成します。たとえば、 sin 関数(sine)のハンドルを作成し、それをf として使用するには:

>> f = @sin
f = 
    @sin
 

fsin 関数のハンドルです。ちょうど(実際の人生では)ドアハンドルはドアを使う方法ですが、関数ハンドルは関数を使う方法です。 f を使うために、引数はsin 関数のように渡されます:

>> f(pi/2)
ans =
     1
 

fsin 関数が受け入れる入力引数を受け入れます。場合はsin (それはしませんが、他の人が行う、例えばゼロ入力引数受け付ける関数となりpeaks 機能を)、 f() 入力引数なしでそれを呼び出すために使用されます。

カスタム無名関数

1つの変数の匿名関数

上の例のsin ように、既存の関数へのハンドルを作成することは明らかに有用ではありません。この例では重複しています。しかし、それ以外の場合は複数回繰り返す必要があるか、または別の関数を作成するカスタムのことを行う無名関数を作成すると便利です。 1つの変数を入力として受け入れるカスタム無名関数の例として、信号の正弦と余弦の二乗を合計します。

>> f = @(x) sin(x)+cos(x).^2
f = 
    @(x)sin(x)+cos(x).^2
 

fx という1つの入力引数を受け入れます。これは、 @ 演算子の直後にかっこ(...) を使用して指定しました。 fxf(x) 無名関数です。これは、 x 値をf 渡すことによって使用されます。

>> f(pi)
ans =
    1.0000
 

値または変数のベクトルもに渡すことができるf 彼らは内の有効な方法で使用されている限り、 f

>> f(1:3) % pass a vector to f
ans =
    1.1334    1.0825    1.1212
>> n = 5:7;
>> f(n) % pass n to f
ans =
   -0.8785    0.6425    1.2254
 

複数の変数の匿名関数

同じ方法で、複数の変数を受け入れるための無名関数を作成することができます。 3つの変数を受け入れる匿名関数の例:

>> f = @(x,y,z) x.^2 + y.^2 - z.^2
f = 
    @(x,y,z)x.^2+y.^2-z.^2
>> f(2,3,4)
ans =
    -3
 

匿名関数のパラメータ化

ワークスペース内の変数は、匿名関数の定義内で使用できます。これはパラメータ化と呼ばれます。たとえば、無名関数で定数c = 2 を使うには:

>> c = 2;
>> f = @(x) c*x
f = 
    @(x)c*x
>> f(3)
ans =
     6
 

f(3) は、提供されたx と乗算するためのパラメータとして変数c を使用しました。この時点でc の値を別の値に設定すると、 f(3) が呼び出され、結果は変わらないことに注意してください。 c の値は、無名関数の作成時の値です。

>> c = 2;
>> f = @(x) c*x;
>> f(3)
ans =
     6
>> c = 3;
>> f(3)
ans =
     6
 

無名関数への入力引数は、ワークスペース変数を参照しません

無名関数の入力引数の1つ( @(...) 使用する)としてワークスペース内の変数名を使用すると、それらの変数の値使用されないことに注意してください。代わりに、無名関数の範囲内で異なる変数として扱われます。つまり、無名関数には、入力変数がメインワークスペースの変数を決して参照しないプライベートな作業領域があります。メインのワークスペースと匿名関数のワークスペースは、お互いの内容を知りません。これを説明する例:

>> x = 3 % x in main workspace
x =
     3
>> f = @(x) x+1; % here x refers to a private x variable
>> f(5)
ans =
     6
>> x
x =
     3
 

メインワークスペースのx の値はf 内では使用されません。また、メインワークスペースでは、 x は変更されませんでした。 f の範囲内で、 @ 演算子の後にある括弧内の変数名は、メインワークスペース変数とは無関係です。

匿名関数は変数に格納されます

匿名関数(より正確には、無名関数を指す関数ハンドル)は、現在の作業領域内の他の値と同様に格納されます。変数(前述のように)、セル配列( {@(x)x.^2,@(x)x+1} )、またはプロパティ(インタラクティブグラフィックスの場合はh.ButtonDownFcn など)であっても。つまり、無名関数は他の値と同様に扱うことができます。これを変数に格納するときは、現在のワークスペースに名前があり、数値を保持する変数と同様に変更およびクリアできます。

別の言い方をする:関数ハンドル( @sin 形式であろうと無名関数であろうと)は、数値行列がそうであるように、単に変数に格納できる値です。

高度な使用

関数ハンドルを他の関数に渡す

関数ハンドルは変数のように扱われるので、関数ハンドルを入力引数として受け入れる関数に渡すことができます。

例:関数ハンドルとスカラー番号を受け入れる関数がmファイルに作成されます。次に、関数ハンドルを3 に渡して関数ハンドルを呼び出し、結果にスカラー番号を追加します。結果が返されます。

funHandleDemo.m 内容:

function y = funHandleDemo(fun,x)
y = fun(3);
y = y + x;
 

MATLABの現在のフォルダなど、パスのどこかに保存します。今、 funHandleDemo は次のように使用できます。

>> f = @(x) x^2; % an anonymous function
>> y = funHandleDemo(f,10) % pass f and a scalar to funHandleDemo
y =
    19
 

既存の別の関数のハンドルをfunHandleDemo に渡すことができます:

>> y = funHandleDemo(@sin,-5)
y =
   -4.8589
 

@sinsin 関数にアクセスするには、最初にf = @sin を使って変数に格納することなく、どのように素早くアクセスするのかにf = @sin

bsxfuncellfun などの関数を匿名関数で使用する

MATLABには、匿名関数を入力として受け入れる組み込み関数がいくつかあります。これは、最小限のコード行で多くの計算を実行する方法です。たとえば、 bsxfun は要素バイナリ演算を実行します。 bsxfun 、要素bsxfun に2つのベクトルまたは行列に関数を適用します。通常、これはの使用が必要となるfor 、多くの場合、速度のため事前割り当てを必要と-loopsを、。 bsxfun を使用bsxfun このプロセスは高速化されます。次の例は、 tictoc 使用して、コードの所要時間をtoc するために使用できる2つの関数を使用してこれを示しています。行列の平均から各行列要素の差を計算します。

A = rand(50); % 50-by-50 matrix of random values between 0 and 1

% method 1: slow and lots of lines of code
tic
meanA = mean(A); % mean of every matrix column: a row vector
% pre-allocate result for speed, remove this for even worse performance
result = zeros(size(A));
for j = 1:size(A,1)
    result(j,:) = A(j,:) - meanA;
end
toc
clear result % make sure method 2 creates its own result

% method 2: fast and only one line of code
tic
result = bsxfun(@minus,A,mean(A));
toc
 

上記の例を実行すると、2つの出力が得られます。

Elapsed time is 0.015153 seconds.
Elapsed time is 0.007884 seconds.
 

これらの行はtoc 関数から来ており、 tic 関数への最後の呼び出しからの経過時間を表示します。

bsxfun 呼び出しは、最初の入力引数の関数を他の2つの入力引数に適用します。 @minus はマイナス記号と同じ操作の長い名前です。意味のある結果を生成するための入力としてA およびmean(A) を受け入れる限り、他の関数とは異なる匿名関数またはハンドル( @ )を指定できました。

特に大量のデータを大量にbsxfun 場合、 bsxfun は処理速度を上げることができます。また、MATLABやbsxfun 知らない人のために解釈するのが難しいかもしれませんが、コードをよりきれいにbsxfun ます。 (MATLAB R2016a以降では、これまでbsxfun 使用していた操作の多くはそれらを必要とせず、 A-mean(A) は直接動作し、場合によってはより高速に動作することがあります)。

セル配列

同じクラスの要素を配列に連結することもできます(関数ハンドルなどの例外はありません)。数値スカラーは、デフォルトではクラスdouble の行列に格納することができます。

>> A = [1, -2, 3.14, 4/5, 5^6; pi, inf, 7/0, nan, log(0)]
A =
   1.0e+04 *
    0.0001   -0.0002    0.0003    0.0001    1.5625
    0.0003       Inf       Inf       NaN      -Inf
 

MATLABのクラスchar であるchar は、同様の構文を使用して配列に格納することもできます。このような配列は、他の多くのプログラミング言語の文字列に似ています。

>> s = ['MATLAB ','is ','fun']
s =
MATLAB is fun
 

両方とも括弧[] を使用していますが、結果クラスは異なります。したがって、それらに対して実行可能な操作も異なります。

>> whos
  Name      Size            Bytes  Class     Attributes

  A         2x5                80  double              
  s         1x13               26  char                
 

実際、配列s は文字列'MATLAB ''is ' 、および'fun' 配列ではなく、単なる文字列で、13文字の配列です。次のいずれかによって定義されている場合、同じ結果が得られます。

>> s = ['MAT','LAB ','is f','u','n'];
>> s = ['M','A','T','L','A','B,' ','i','s',' ','f','u','n'];
 

通常のMATLABベクタでは、異なるクラスの変数やいくつかの異なる文字列を格納することはできません。これは、 cell 配列が便利な場所です。これは、それぞれが必要に応じてすべてのセルで異なることができる、いくつかのMATLABオブジェクトを含むことができるセルの配列です。要素の周りに中かっこ{} 使用して、セル配列に格納します。

>> C = {A; s}
C = 
    [2x5 double]
    'MATLAB is fun'
>> whos C
  Name      Size            Bytes  Class    Attributes

  C         2x1               330  cell 
 

どのクラスの標準MATLABオブジェクトもセル配列に一緒に格納できます。セル配列は、内容を格納するためにより多くのメモリを必要とすることに注意してください。

セルの内容にアクセスするには、中括弧{} を使用します。

>> C{1}
ans =
   1.0e+04 *
    0.0001   -0.0002    0.0003    0.0001    1.5625
    0.0003       Inf       Inf       NaN      -Inf
 

C(1)C{1} とは異なることに注意してください。後者はセルの内容を返しますが(例ではclass double を持ちます)、前者はC サブ配列であるセル配列を返します。同様に、 D が10×5のセル配列である場合、 D(4:8,1:3) はサイズが5×3でそのクラスがcell であるD サブ配列を戻します。構文C{1:2}C{1:2} つの返されたオブジェクトはありませんが、2つの異なるオブジェクトを返します(複数の戻り値を持つMATLAB関数に似ています)。

>> [x,y] = C{1:2}
x =
                         1                        -2                      3.14                       0.8                     15625
          3.14159265358979                       Inf                       Inf                       NaN                      -Inf
y =
MATLAB is fun
 

データ型

MATLABには16の基本データ型またはクラスがあります。これらのクラスのそれぞれは、行列または配列の形式です。関数ハンドルを除いて、この行列または配列は最小でも0から0までの大きさであり、任意のサイズのn次元配列に拡張できます。関数ハンドルは常にスカラ(1行1列)です。

MATLABの重要な瞬間は、デフォルトで型宣言または次元ステートメントを使用する必要がないことです。新しい変数MATLABを定義すると、それが自動的に作成され、適切なメモリ空間が割り当てられます。

例:

a = 123;
b = [1 2 3];
c = '123';

>> whos
  Name      Size            Bytes  Class     Attributes

  a         1x1                 8  double              
  b         1x3                24  double              
  c         1x3                 6  char    
 

変数がすでに存在する場合、MATLABは元のデータを新しいものに置き換え、必要に応じて新しい記憶域を割り当てます。

基本データ型

基本的なデータ型は、数値、 logicalcharcellstructtablefunction_handle です。

数値データ型

  • 浮動小数点数デフォルト

    MATLABは、倍精度または単精度のいずれかの形式で浮動小数点数を表します。デフォルトは倍精度ですが、簡単な変換関数を使用して任意の精度で任意の精度を設定できます。

    a = 1.23;
    b = single(a);
    
    >> whos
      Name      Size            Bytes  Class     Attributes
    
      a         1x1                 8  double              
      b         1x1                 4  single     
     
  • 整数

    MATLABには、4つの符号付き整数クラスと4つの符号なし整数クラスがあります。符号付きの型を使用すると、負の整数と正の値を扱うことができますが、符号なしの型の範囲を数値の正負符号を指定するために使用できます。符号なしの型は、より広い範囲の数値を返しますが、これらの数値は0または正の値のみになります。

    MATLABは整数データに対して1バイト、2バイト、4バイト、8バイトの記憶域をサポートしています。データを格納する最小の整数型を使用すると、プログラムのメモリと実行時間を節約できます。たとえば、値100を格納するために32ビットの整数は必要ありません。

    a = int32(100);
    b = int8(100);
    
    >> whos
      Name      Size            Bytes  Class    Attributes
    
      a         1x1                 4  int32              
      b         1x1                 1  int8               
     

    データを整数として格納するには、doubleから目的の整数型に変換する必要があります。整数に変換される数値に小数部分がある場合、MATLABは最も近い整数に丸めます。端数部分が正確に0.5 場合、2つの等しく近い整数から、MATLABは、絶対値の絶対値が大きいものを選択します。

    a  = int16(456);
     
  • char

    文字配列は、MATLABのテキストデータを格納します。伝統的なプログラミング用語に沿って、文字の配列(シーケンス)は文字列として定義されます。 MATLABのリテールリリースには明示的な文字列型はありません。

  • 論理値:1または0の論理値はそれぞれ真と偽を表します。リレーショナル条件と配列インデックスに使用します。 TRUEまたはFALSEなので、1バイトのサイズです。

    a = logical(1);
     
  • 構造。構造体配列は、 フィールドと呼ばれるデータコンテナを使用して異なるデータ型の変数をグループ化するデータ型です。各フィールドには、任意のタイプのデータを含めることができます。構造体のデータにアクセスするには、structName.fieldNameという形式のドット表記を使用します。

    field1 = 'first';
    field2 = 'second';
    value1 = [1 2 3 4 5];
    value2 = 'sometext';
    s = struct(field1,value1,field2,value2);
     

    value1にアクセスするには、次の各構文は同等です

    s.first or s.(field1) or s.('first')
     

    最初のメソッドが存在することがわかっているフィールドに明示的にアクセスするか、または2番目の例でフィールドにアクセスするために文字列を渡すか文字列を作成します。 3番目の例では、ドットの親子表記法がfield1変数に格納されているものと同じ文字列を受け取ることをデモストレーションしています。

  • テーブル変数は異なるサイズとデータ型にすることができますが、すべての変数の行数は同じでなければなりません。

    Age = [15 25 54]';
    Height = [176 190 165]';
    Name = {'Mike', 'Pete', 'Steeve'}';
    T = table(Name,Age, Height);
     
  • 細胞。これは非常に便利なMATLABのデータ型です。セル配列は、配列の各要素が異なるデータ型とサイズを持つことができます。それはあなたが望むようにデータを操作するための非常に強力な手段です。

    a = { [1 2 3], 56, 'art'};
     

    または

    a = cell(3);
     
  • 関数ハンドルは、関数へのポインタ(例えば、匿名関数) 格納します。これにより、関数を別の関数に渡すことも、メイン関数の外部からローカル関数を呼び出すこともできます。

各データ型と組み込みのデータ型変換関数str2doubletable2cell )でtable2cell する多くの手段がありstr2double

追加のデータ型

特定の場合に有用ないくつかの追加のデータ型があります。彼らです:

  • 日付と時刻:日付、時刻、期間を表す配列。 datetime('now')21-Jul-2016 16:30:16 返します。

  • カテゴリカル配列:一連の離散カテゴリからの値を含むデータを格納するデータ型です。数値以外のデータを格納するのに便利です(メモリ有効)。テーブル内で行グループを選択するために使用できます。

    a = categorical({'a' 'b' 'c'});
     
  • マップコンテナは、任意のスカラー数値だけでなく文字ベクトルを索引付けするユニークな機能を持つデータ構造です。マップの要素へのインデックスはキーと呼ばれます。これらのキーは、それらに関連付けられたデータ値とともに、マップ内に格納されます。

  • 時系列とは、時々刻々とサンプリングされたデータベクトルであり、多くの場合、規則的な間隔でサンプリングされる。タイムステップと関連づけられたデータを保存すると便利です。また、作業するには多くの便利な方法があります。

こんにちは世界

新しい空白のドキュメントをMATLABエディタで開きます(最近のバージョンのMATLABでは、ツールストリップの[ホーム]タブを選択し、[新しいスクリプト]をクリックしてこれを行います)。新しいスクリプトを作成するデフォルトのキーボードショートカットはCtrl-n です。

あるいは、 edit myscriptname.m を入力edit myscriptname.m ファイルが編集用に開きますmyscriptname.m ファイルがMATLABパス上に存在しない場合は、そのファイルを作成するように指定できます。

エディタで次のように入力します。

disp('Hello, World!');
 

ツールストリップの[エディタ]タブを選択し、[名前を付けて保存]をクリックします。ドキュメントをhelloworld.m というカレントディレクトリにあるファイルに保存します。タイトルのないファイルを保存すると、ファイルに名前を付けるダイアログボックスが表示されます。

MATLABコマンドウィンドウで、次のように入力します。

>> helloworld
 

MATLABコマンドウィンドウに次の応答が表示されます。

Hello, World!
 

コマンドウィンドウでは、関数やスクリプトファイルの名前を入力したり、MATLABに付属のスクリプトファイルを実行して実行することができます。

ここでは、 'helloworld'スクリプトを実行しました。拡張子( .m )を入力する必要はないことに注意してください。スクリプトファイルに保存されている命令はMATLABで実行され、ここでは 'Hello、World!' disp 関数を使用します。

スクリプトファイルは、後で(再)使用のために一連のコマンドを保存するためにこのように書くことができます。

あなた自身を助ける

MATLABには、単純な乗算から画像認識ツールボックスまで、さまざまなスクリプトと関数が組み込まれています。使用する関数に関する情報を取得help functionname は、コマンドラインでhelp functionname と入力します。 help 機能を例に挙げてみましょう。

それを使用する方法に関する情報は、次のように入力して取得できます。

>> help help

コマンドウィンドウに表示されます。これにより、関数help の使用情報が返されhelp 。探している情報がまだ不明な場合は、関数のドキュメントページを試すことができます。単純に以下を入力してください:

>> doc help

コマンドウィンドウに表示されます。これにより、機能help のページにあるブラウズ可能なドキュメントが開き、「ヘルプ」の仕組みを理解するために必要なすべての情報が提供されます。

この手順は、すべての組み込み関数およびシンボルに対して機能します。

独自の関数を開発するときは、関数ファイルの先頭に、または関数宣言の直後にコメントを追加することで、独自のヘルプセクションを持つことができます。

簡単な関数の例は、 multiplyby2 ファイルに保存されてmultiplyby2.m

function [prod]=multiplyby2(num)
% function MULTIPLYBY2 accepts a numeric matrix NUM and returns output PROD 
% such that all numbers are multiplied by 2

    prod=num*2;
end
 

または

% function MULTIPLYBY2 accepts a numeric matrix NUM and returns output PROD 
% such that all numbers are multiplied by 2

function [prod]=multiplyby2(num)
    prod=num*2;
end
 

これは、コードを書いてから数週間/月/年のコードを受け取ったときに非常に便利です。

helpdoc 関数は多くの情報を提供し、それらの機能の使い方を学ぶことで、MATLABを効率的に使用して迅速に進歩させるのに役立ちます。

インデックス行列と配列

MATLABでは、行列や配列の要素にインデックスを付ける(アクセスする)いくつかのメソッドが使用できます。

  • 添え字インデクシング - 行列の各次元に必要な要素の位置を別々に指定します。
  • 線形インデクシング - 行列がその次元に関係なくベクトルとして扱われる。つまり、行列の各位置を1つの番号で指定します。
  • 論理インデックス -あなたは論理的マトリックス(とのマトリックスを使用truefalse 値を)あなたは返すためにどの値を指定するためのマスクとしてインデックスにしようとしているマトリックスの同じ寸法で。

これらの3つの方法は、以下の3行3列の行列M を例として使用してより詳細に説明される。

>> M = magic(3)

ans = 

       8    1    6
       3    5    7
       4    9    2
 

添え字インデックス作成

要素にアクセスする最も単純な方法は、行 - 列インデックスを指定することです。たとえば、2行目と3列目の要素にアクセスするには、次のようにします。

>> M(2, 3)

ans =

      7
 

提供される添え字の数は、 M 個の次元の数(この例では2つ)と正確に一致します。

添え字の順序は、数学的な規則と同じであることに注意してください。行インデックスが最初です。さらに、ほとんどのプログラミング言語のように、MATLABインデックス1 から始まり 0 ありません

単一の数ではなく、各座標のベクトルを渡すことで、複数の要素を一度に索引付けすることができます。たとえば、2番目の行全体を取得するには、1番目、2番目、3番目の列を指定することができます。

>> M(2, [1,2,3])

ans =

       3    5    7
 

MATLABでは、ベクトル[1,2,3] はコロン演算子、つまり1:3 を使用して簡単に作成されます。これをインデックスにも使用できます。行全体(または列)を選択するには、MATLABはあなただけで指定可能にすることにより、ショートカットを提供します: 。たとえば、次のコードは2行目全体を返します

>> M(2, :)

ans =

       3    5    7
 

MATLABには、 end キーワードの形式でディメンションの最後の要素を指定するためのショートカットも用意されています。 end キーワードは、そのディメンションの最後の要素の番号と同じように機能します。したがって、 2 列目から最後の列までのすべての列が必要な場合は、次のように記述します。

>> M(2, 2:end)

ans =

       5    7
 

添字の索引付けは、異なる列と行から単一の値を抽出することを許可しないため制限的です。すべての行と列の組み合わせが抽出されます。

>> M([2,3], [1,3])
ans =

       3    7
       4    2
 

たとえば、添え字索引付けでは要素M(2,1) またはM(3,3) のみを抽出することはできません。これを行うには、線形インデックス付けを考慮する必要があります。

線形インデクシング

MATLABでは、次元を1つだけ使用してインデックスを作成するときに、n次元配列を1次元配列として扱うことができます。最初の要素に直接アクセスすることができます:

>> M(1)

ans = 

       8
 

配列は、MATLABのカラムメジャー順に格納されています。つまり、まずカラムを下に移動してエレメントにアクセスします。したがって、 M(2)3 である第1列の第2要素であり、 M(4) は第2列の第1要素である。

>> M(4)

ans = 

        1
 

MATLABには、添え字インデックスを線形インデックスに変換する組み込み関数があり、その逆もあります:それぞれsub2ind ind2sub です。添字( rc )を線形インデックスに手動で変換することができます。

idx = r + (c-1)*size(M,1)
 

これを理解するために、最初の列にある場合、線形インデックスは単に行インデックスになります。 c == 1 ため、 (c-1) == 0 、上記の式はこれに当てはまります。次の列では、線形インデックスは行番号+前の列のすべての行です。

end キーワードがまだ適用され、配列の最後の要素、つまりM(end) == M(end, end) == 2 参照していることに注意してください。

線形索引付けを使用して複数の要素を索引付けすることもできます。これを行うと、返される行列はインデックスベクトルの行列と同じ形になります。

M(2:4)2:4 が行ベクトル[2,3,4] 表すため、行ベクトルを返します。

>> M(2:4)

ans =

        3    4    1
 

他の例として、 M([1,2;3,4]) は、 [1,2;3,4] も2行2列の行列であるため、2行2列の行列を返します。自分自身を説得するには、以下のコードを参照してください。

>> M([1,2;3,4])

ans =

       8        3
       4        1
 

: 単独でインデックスを作成すると、 常に列ベクトル返されることに注意してください。

>> M(:)

ans = 

        8
        3
        4
        1
        5
        9
        6
        7
        2
 

この例は、MATLABが線形インデクシングを使用するときに要素を返す順序も示しています。

論理インデックス

索引付けの3番目の方法は、論理行列、つまりtrue またはfalse 値のみを含む行列をマスクとして使用して、不要な要素を除外することです。たとえば、 5 より大きいM すべての要素を見つけるには、論理行列を使用できます

>> M > 5

ans =

    1    0    1
    0    0    1
    0    1    0
 

M をインデックス付けし、次のように5 より大きい値のみを返します。

>> M(M > 5)

ans =

        8
        9
        6
        7
 

これらの数値を所定の位置に保持したい場合(つまり、行列の形状を保つ)、論理補数に割り当てることができます

>> M(~(M > 5)) = NaN

ans = 

    8      NaN    6
    NaN    NaN    7
    NaN    9      Nan
 

iffor 文を含む複雑なコードブロックはif 論理インデックスを使用して減らすことができます。

非ベクトル化(線形インデクシングを使用して既に1つのループに短縮されている):

for elem = 1:numel(M)
  if M(elem) > 5
    M(elem) = M(elem) - 2;
  end
end
 

これは、論理インデックスを使用して次のコードに短縮することができます:

idx = M > 5;
M(idx) = M(idx) - 2;
 

またはさらに短く:

M(M > 5) = M(M > 5) - 2;
 

インデックス作成の詳細

より高い次元の行列

上記のすべてのメソッドは、n次元に一般化されます。 3次元の行列M3 = rand(3,3,3) を例として使用すると、3次元の2番目のスライスのすべての行と列に書き込みでアクセスできます

>> M(:,:,2)
 

線形インデックスを使用して、2番目のスライスの最初の要素にアクセスできます。リニアインデックスは、最初のスライスのすべての行とすべての列の後に2番目のスライスに移動します。その要素の線形インデックスは

>> M(size(M,1)*size(M,2)+1)
 

実際、MATLABでは、 すべての行列はn次元です。ほとんどの他のn次元のサイズは1つです。したがって、もしa = 2 ならばa(1) == 2 (期待通り)であるが、 a(1, 1) == 2 a(1, 1, 1) == 2a(1, 1, 1, ..., 1) == 2 a(1, 1, 1) == 2a(1, 1, 1, ..., 1) == 2 などとなる。これらの「余分な」ディメンション(サイズ1 )は、 シングルトンディメンションと呼ばれます。コマンドsqueeze はそれらを削除し、周囲の次元の順序を入れ替えるためにpermute を使うことができます(必要に応じてシングルトンの次元を導入します)。

n次元行列は、m個の添字(m≦n)を用いて索引付けすることもできる。線形インデックスが(n-m + 1)次元を参照するように、最後の(m'th)添え字が残りの(n-m + 1)次元を参照する一方で、最初のm-1の添字は通常通り動作するという規則があるアレイ。次に例を示します。

>> M = reshape(1:24,[2,3,4]);
>> M(1,1)
ans =
     1
>> M(1,10)
ans =
    19
>> M(:,:)
ans =
     1     3     5     7     9    11    13    15    17    19    21    23
     2     4     6     8    10    12    14    16    18    20    22    24
 

要素の範囲を返す

添え字インデックスを使用すると、複数の次元で複数の要素を指定すると、MATLABは可能な各座標のペアを返します。例えば、あなたはMしようとした場合、([1,2]、[1,3])MATLABは、戻りますM(1,1)M(2,3) が、それはまた戻りますM(1,3) 及びM(2,1) 。これは座標ペアのリストの要素を探しているときには直感的ではないようですが、もっと大きな行列A = rand(20) の例を考えてみましょう( A20 バイトで20 なります)。右上の四分円。代わりに、その象限内の全ての座標ペア(となります。この場合、この指定することのこの場合は100 組)を、あなただけの指定10 行と10 したい列のでA(1:10, 11:end) このような行列をスライスすることは、座標ペアのリストを必要とするよりはるかに一般的です。

座標ペアのリストを取得したい場合は、最も簡単な解決策は、リニアインデックスに変換することです。返される列インデックスのベクトルを持つ問題を考えてみましょう。ベクトルの各行には、行列の対応する行に返す列番号が含まれています。例えば

colIdx = [3;2;1]
 

だから、この場合、実際に(1,3)(2,2)(3,1) の要素を取り戻そうとしています。したがって、線形インデクシングを使用する:

>> colIdx = [3;2;1];
>> rowIdx = 1:length(colIdx);
>> idx = sub2ind(size(M), rowIdx, colIdx);
>> M(idx)

ans = 

        6    5    4
 

複数回要素を返す

添え字と線形の索引付けを使用すると、索引を繰り返して複数回要素を戻すこともできます。

>> M([1,1,1,2,2,2])

ans = 

        8    8    8    3    3    3
 

これを使用して行と列全体を複製して、たとえば最初の行と最後の列を繰り返すことができます

>> M([1, 1:end], [1:end, end])

ans = 

        8    1    6    6 
        8    1    6    6
        3    5    7    7
        4    9    2    2
 

詳細については、 こちらを参照してください

行列と配列

MATLABでは、最も基本的なデータ型は数値配列です。これは、スカラ、1次元ベクトル、2次元行列、またはND多次元配列であり得る。

% a 1-by-1 scalar value
x = 1;
 

行ベクトルを作成するには、要素を角かっこで区切って括弧で囲んで入力します。

% a 1-by-4 row vector
v = [1, 2, 3, 4];
v = [1 2 3 4];
 

列ベクトルを作成するには、要素をセミコロンで区切ります。

% a 4-by-1 column vector
v = [1; 2; 3; 4];
 

行列を作成するには、以前と同じように行をセミコロンで区切って入力します。

% a 2 row-by-4 column matrix
M = [1 2 3 4; 5 6 7 8];

% a 4 row-by-2 column matrix
M = [1 2; ...
     4 5; ...
     6 7; ...
     8 9];
 

行/列のサイズが等しくない行列を作成できないことに注意してください。すべての行は同じ長さでなければならず、すべての列は同じ長さでなければなりません。

% an unequal row / column matrix
M = [1 2 3 ; 4 5 6 7]; % This is not valid and will return an error

% another unequal row / column matrix
M = [1 2 3; ...
     4   5; ...
     6 7 8; ...
     9   10];     % This is not valid and will return an error
 

ベクトルまたは行列を転置するには、 .' -operator、または' 演算子は、その転置の複素共役であるエルミート共役を取る。実際の行列の場合、これら2つは同じです。

% create a row vector and transpose it into a column vector
v = [1 2 3 4].';              % v is equal to [1; 2; 3; 4];

% create a 2-by-4 matrix and transpose it to get a 4-by-2 matrix
M = [1 2 3 4; 5 6 7 8].';     % M is equal to [1 5; 2 6; 3 7; 4 8]

% transpose a vector or matrix stored as a variable
A = [1 2; 3 4];
B = A.';                      % B is equal to [1 3; 2 4]
 

2次元以上の配列の場合、文字通り直接入力するための言語構文はありません。代わりに、私たちは(そのように構築するための関数を使用しなければならないoneszerosrand )または(のような機能を使用して他の配列操作することにより、 catreshapepermute )。いくつかの例:

% a 5-by-2-by-4-by-3 array (4-dimensions)
arr = ones(5, 2, 4, 3);

% a 2-by-3-by-2 array (3-dimensions)
arr = cat(3, [1 2 3; 4 5 6], [7 8 9; 0 1 2]);

% a 5-by-4-by-3-by-2 (4-dimensions)
arr = reshape(1:120, [5 4 3 2]);
 

入力と出力の読み込み

すべてのプログラミング言語と同様に、Matlabはさまざまなフォーマットで読み書きできるように設計されています。ネイティブライブラリは、各バージョンのアップデートに含まれるより多くのフォーマットのテキスト、イメージ、ビデオ、オーディオ、データフォーマットを多数サポートしています。サポートされているファイルフォーマットの完全なリストとそれらをインポートするための機能を確認してください。

ファイルを読み込もうとする前に、データをどのようにしたいのか、コンピュータがデータをどのように整理するのかを自分で尋ねなければなりません。次の形式のtxt / csvファイルがあるとします。

Fruit,TotalUnits,UnitsLeftAfterSale,SellingPricePerUnit
Apples,200,67,$0.14
Bananas,300,172,$0.11
Pineapple,50,12,$1.74
 

最初の列は文字列形式で、2番目と3番目は数値で、最後の列は通貨形式です。 Matlabを使用して今日どのくらいの収入を得て、最初にこのtxt / csvファイルにロードしたいのかを見たいとしましょう。リンクを確認した後、txtファイルのString型とNumeric型がtextscan によって処理されることがtextscan ます。だから我々は試すことができる:

fileID = fopen('dir/test.txt'); %Load file from dir
C = textscan(fileID,'%s %f %f %s','Delimiter',',','HeaderLines',1); %Parse in the txt/csv
 

ここで、 %s は要素がString型であり、 %f は要素がFloat型であり、ファイルが "、"で区切られていることを示しています。 HeaderLinesオプションはMatlabに最初のN行をスキップするように要求しますが、直後の1は最初の行(ヘッダ行)をスキップすることを意味します。

現在、Cはロードされたデータであり、それぞれ4セルのセル配列の形式であり、それぞれがtxt / csvファイルのデータの列を含んでいます。

だから最初に2番目の列から3番目の列を減算して今日売った果実の数を計算したいのですが、これは次のようにして行うことができます:

sold = C{2} - C{3}; %C{2} gives the elements inside the second cell (or the second column)
 

今度は、このベクトルに単価を乗算したいので、最初にStringの列をNumbersの列に変換し、Matlabのcell2mat を使用して数値行列に変換する必要があります。最初に行う必要があるのは、 "$"記号をオフにするには、これを行う方法はたくさんあります。最も直接的な方法は単純な正規表現を使うことです:

D = cellfun(@(x)(str2num(regexprep(x, '\$',''))), C{4}, 'UniformOutput', false);%cellfun allows us to avoid looping through each element in the cell.
 

または、ループを使用することもできます:

for t=1:size(C{4},1)
   D{t} = str2num(regexprep(C{4}{t}, '\$',''));
end

E = cell2mat(D)% converts the cell array into a Matrix
 

str2num 関数は "$"記号を数値型に取り除いた文字列をcell2matcell2mat は数値要素のセルを数値の行列に変換します

今では、販売台数に単価を乗算することができます。

revenue = sold .* E; %element-wise product is denoted by .* in Matlab

totalrevenue = sum(revenue);
 

スクリプトと関数

MATLABコードは、mファイルに保存して再利用することができます。 mファイルには、自動的にMATLABに関連付けられた.m 拡張子が付きます。 mファイルには、スクリプトまたは関数を含めることができます。

スクリプト

スクリプトは、あらかじめ定義された順序で一連のMATLABコマンドを実行する単なるプログラムファイルです。

スクリプトは入力を受け付けず、スクリプトは出力を返しません。機能的には、スクリプトはMATLABコマンドウィンドウにコマンドを直接入力し、それらを再生できることと同等です。

スクリプトの例:

length = 10;
width = 3;
area = length * width;
 

このスクリプトは、定義するlengthwidth 、及びarea 値と現在のワークスペースでは103 、及び30 それぞれ。

前述のように、上記のスクリプトはコマンドウィンドウに直接同じコマンドを入力するのと機能的に同等です。

>> length = 10;
>> width = 3;
>> area = length * width;
 

関数

関数は、スクリプトと比較してはるかに柔軟で拡張性があります。スクリプトとは異なり、関数は呼び出し元に入力を受け入れ、出力を返すことができます。関数には独自の作業領域があります。つまり、関数の内部操作によって呼び出し元から変数が変更されることはありません。

すべての関数は、同じヘッダー形式で定義されています。

function [output] = myFunctionName(input)
 

function キーワードはすべての関数ヘッダーから始まります。出力のリストは次のとおりです。出力のリストは、返す変数のカンマ区切りのリストでもあります。

function [a, b, c] = myFunctionName(input)
 

次は、呼び出しに使用される関数の名前です。これは一般にファイル名と同じ名前です。たとえば、この関数をmyFunctionName.m として保存します。

関数名の後には、入力のリストがあります。出力と同様に、カンマで区切ったリストにすることもできます。

function [a, b, c] = myFunctionName(x, y, z)
 

前の例のスクリプトは、次のような再利用可能な関数として書き直すことができます。

function [area] = calcRecArea(length, width)
   area = length * width;
end
 

他の関数やスクリプトファイルからも関数を呼び出すことができます。スクリプトファイルで使用されている上記の関数の例を次に示します。

l = 100;
w = 20;
a = calcRecArea(l, w);
 

前述のように、我々が作成lw 、そしてa の値をワークスペース内の10020 、および2000 それぞれ。