MATLABとPythonのコード対応(行列編)


まえがき

MATLABでコードを書いたり読んだりするときに「Pythonでこう書いてたやつはMATLABではどう書くのだ?」といつもなるので、まとめてみました。

今回は行列関連。Python側はNumPy的な内容となります。

コメント

Python
# コメント
MATLAB
% コメント

行列のインデックス

numpyではC配列などと同じくインデックスは0始まりとなるが、matlabは1始まりとなるので注意

  • PythonはCと同じく0始まりで、終端のインデックスはN-1となる。
  • MATLABは1始まりで、終端のインデックスはNとなる。

(N ... 要素数)

Python
x = np.array([1,2,3])

# x[0] ... 1
# x[1] ... 2
# x[2] ... 3
MATLAB
x = [1 2 3];

% x(1) ... 1
% x(2) ... 2
% x(3) ... 3

行列の作成

行列を生成する

Python
x = np.array([[1, 2, 3], [4, 5, 6]])

# array([[1, 2, 3],
#        [4, 5, 6]])
MATLAB
x = [1 2 3; 4 5 6]

% x =
%      1     2     3
%      4     5     6

すべての要素が0の行列を作成

Python
x = np.zeros((3,4))

# array([[0., 0., 0., 0.],
#        [0., 0., 0., 0.],
#        [0., 0., 0., 0.]])
MATLAB
x = zeros(3,4);

% x =
%      0     0     0     0
%      0     0     0     0
%      0     0     0     0

すべての要素が1の行列を作成

Python
np.ones((3,4))

# array([[1., 1., 1., 1.],
#        [1., 1., 1., 1.],
#        [1., 1., 1., 1.]])
MATLAB
x = ones(3,4)

% x =
%      1     1     1     1
%      1     1     1     1
%      1     1     1     1

等間隔で連続値のベクトルを作成

間隔を指定

numpyでは終端の値が含まれないが、matlabでは終端の値が含まれる
という違いがあるので注意

Python
# 0〜1の間を0.1間隔で
# ※終端の1は含まれない
x = np.arange(0, 1, 0.1)

# array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
MATLAB
% 0〜1の間を0.1間隔で
% ※終端の1は含まれる
x = 0:0.1:1

% x =
%          0    0.1000    0.2000    0.3000    0.4000    0.5000    0.6000    0.7000    0.8000    0.9000    1.0000

間隔の指定を省略

間隔の指定を省略すると、python, matlab双方とも間隔1として動作する

Python
x = np.arange(0, 10)
# array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
MATLAB
x = 1:10

% x =
%      1     2     3     4     5     6     7     8     9    10

何等分するかを指定

Python
# 0〜1の間を11等分で
x = np.linspace(0, 1, 11)

# array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])

↑ linspaceだとNumpyでも終端に指定した値が含まれる模様

MATLAB
% 0〜1の間を11等分で
x = linspace(0, 1, 11)

% x =
%          0    0.1000    0.2000    0.3000    0.4000    0.5000    0.6000    0.7000    0.8000    0.9000    1.0000

行列要素へのアクセス

2次元以上の行列へのアクセス

Python
x = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])

# >> x[1, 2]
# 7
MATLAB
x = [1 2 3 4; 5 6 7 8; 9 10 11 12];

% x(2, 3)
% ans =
%      7

範囲で指定

  • pythonは終端の要素を含まないが、matlabは含む
Python
>> x = np.array([1, 2, 3, 4, 5])
>> x[2:4]
array([3, 4])
MATLAB
>> x = [1 2 3 4 5];
>> x(2:4)
ans =
     2     3     4

最後の要素を指定

python:Python

  • インデックスの-1 は、最後の要素を示す。
  • 最後から2番目の要素は-2,、 最後から3番目の要素は-3 。。。(以下続く)

matlab:MATLAB

  • 「end」は最後の要素のインデックスを示す。
  • 最後から2番目の要素は「end-1」と記述すればよい。
Python
>> x = np.array([1, 2, 3, 4, 5])
>> x[-1]
5

>> x[-2]
4
MATLAB
>> x = [1 2 3 4 5];
>> x(end)
ans =
     5

>> x(end-1)
ans =
     4

おわりに

随時更新していきます