1. ホーム
  2. matlab

[解決済み] MATLABの[]と[1x0]の違いについて

2022-02-28 16:16:38

質問

MATLABで、ワークスペース(2011b、Windows 7、64ビット)のセル配列に以下の項目を入力するループがあります。

my_array = 
    [1x219 uint16]
    [         138]
    [1x0   uint16] <---- row #3
    [1x2   uint16]
    [1x0   uint16]
    []             <---- row #6
    [         210]
    [1x7   uint16]
    [1x0   uint16]
    [1x4   uint16]
    [1x0   uint16]
    [         280]
    []
    []
    [         293]
    [         295]
    [1x2   uint16]
    [         298]
    [1x0   uint16]
    [1x8   uint16]
    [1x5   uint16]

いくつかのエントリでは [] のように、行の #6 を保持するものもあれば [1x0] 行のように #3 .

  1. あるのか 任意の の違いは何ですか?(MATLABがそれらを異なって表示するという事実以外に)。 MATLABがメモリ上でそれらを表現する方法に何か違いがありますか?
  2. もし、MATLABが内部的にそれらをどのように表現するかという違いだけであるならば、なぜ プログラマー この違いを意識する必要があるのでしょうか?(つまり、なぜ表示が違うのか?)。これは(無害な)バグなのでしょうか? メリット このような配列が異なる方法で表現されていることを知ることはできますか?

どのように解決するのですか?

最も の場合(例外として以下を参照)、実質的な違いはありません。どちらも "空" しかし、プログラマーとしては、この情報を見たい場合もあるでしょうから、これをバグとは言いません。

例えば、2次元の行列があり、より小さな行列に抽出するために、いくつかの行と列にインデックスを付けたいとします。

>> M = magic(4)  %# Create a 4-by-4 matrix

M =
    16     2     3    13
     5    11    10     8
     9     7     6    12
     4    14    15     1

>> rowIndex = [1 3];  %# A set of row indices
>> columnIndex = [];  %# A set of column indices, which happen to be empty
>> subM = M(rowIndex,columnIndex)

subM =
   Empty matrix: 2-by-0

空の結果は、まだいくつかの情報、特に、元の行列から2行をインデックス化しようとしたことを教えてくれることに注意してください。もし結果が [] 行のインデックスが空なのか、列のインデックスが空なのか、あるいはその両方なのかがわからないのです。

注意点...

として定義された空白の行列が、場合によっては [] (つまり、すべての次元が 0 の) 空の行列と、0 ではない次元をいくつか持つ空の行列では、結果が異なる場合があります。例えば、行列の乗算は、異なる種類の空の行列を扱った場合、異なる(そして、やや直感的ではない)結果を与えることがあります。ここでは、3つの空の行列を考えてみましょう。

>> a = zeros(1,0);  %# A 1-by-0 empty matrix
>> b = zeros(0,1);  %# A 0-by-1 empty matrix
>> c = [];          %# A 0-by-0 empty matrix

では、これらをいろいろな方法で掛け合わせてみましょう。

>> b*a

ans =
     []  %# We get a 0-by-0 empty matrix. OK, makes sense.

>> a*b

ans =
     0   %# We get a 1-by-1 matrix of zeroes! Wah?!

>> a*c

ans =
   Empty matrix: 1-by-0  %# We get back the same empty matrix as a.

>> c*b

ans =
   Empty matrix: 0-by-1  %# We get back the same empty matrix as b.

>> b*c
??? Error using ==> mtimes
Inner matrix dimensions must agree.  %# The second dimension of the first
                                     %#   argument has to match the first
                                     %#   dimension of the second argument
                                     %#   when multiplying matrices.

2つの空の行列を掛け合わせて空でない行列を作るのは、頭が痛くなりそうですが、結果がまだ何も含んでいない(つまり値が0である)ので、ちょっと意味があるのです。