次のエラーがかなり頻繁に発生します。
添字インデックスは、実数の正の整数または論理値でなければなりません。
私はこれについて多くの質問を見つけましたが、本当に一般的な答えを持つものではありません。したがって、私はこの問題に対処するための一般的な解決策を持ちたいと思います。
回答:
回答№1の61添字インデックスは、実数の正の整数または論理値でなければなりません。
ほとんどすべての場合、このエラーは2つの理由のうちの1つによって引き起こされます。幸い、これについては簡単な確認があります。
まず最初に、エラーが発生した場所にいることを確認します。これは通常、次のコマンドを使用して実行できます。 dbstop if error
関数やスクリプトを実行する前にこれで最初の問題を確認できます。
1.どこかに無効なインデックスが変数にアクセスするために使われている
すべての変数を見つけて、それらがどのように索引付けされているかを調べます。索引付けされている変数は通常、次のいずれかの形式になっています。
variableName(index,index)
variableName{index,index}
variableName{indices}(indices)
角かっこの間のものを見て、すべてのインデックスを選択します。それからヒット f9
結果を評価し、それが実数の正の整数か論理値かをチェックします。目視検査で通常は十分です(許容値はtrue、false、または1,2,3、...になります。 0以外)しかし、大きな行列のためにあなたはのようなものを使うことができます isequal(index, round(index))
より正確には isequal(x, max(1,round(abs(x))))
実数の正の整数をチェックします。使用できるクラスを確認する class(index)
値がすべて "true"または "false"の場合、これは "logical"を返します。
以下の例のように変わって見えるようなものであっても、必ずすべてのインデックスを評価して確認してください。すべてのインデックスがチェックアウトされている場合、おそらく2番目の問題に直面しています。
2.関数名がユーザー定義変数によって隠されています
MATLAB関数はしばしば非常に直感的な名前を持ちます。 これは便利ですが、誤って(組み込みの)関数をオーバーロードしてしまうことがあります。例えば、関数と同じ名前の変数を作成することができます。 max = 9
そしてあなたの残りのためにスクリプト/関数Matlabは考えるでしょう max
関数ではなく変数になる max
あなたがのような何かをしようとすると、あなたはこのエラーが発生します max([1 8 0 3 7])
そのベクトルの最大値を返す代わりに、Matlabはあなたが変数にインデックスを付けようとしていると仮定するため max
そして 0
無効なインデックスです。
あなたが持っている変数をチェックするために、ワークスペースを見ることができます。しかし、体系的なアプローチを探しているのであれば、ここに1つあります。
角かっこが後に続くすべての文字または単語に対して ()
手順1で適切なインデックスがあることが確認されていません。実際に変数であるかどうかを確認してください。これは、を使用して簡単に実行できます。 which
.
例
無効なインデックスの単純な出現
a = 1;
b = 2;
c = 3;
a(b/c)
ここで評価します b/c
そしてそれが丸みを帯びた数字ではないことがわかります。
無効なインデックスの複雑な発生
a = 1;
b = 2;
c = 3;
d = 1:10;
a(b+mean(d(cell2mat({b}):c)))
裏返して作業することをお勧めします。そのため、最初にインデックス付けされている最も内側の変数を評価します。 d
。それは、 cell2mat({b}):c
、整数にうまく評価されます。それから評価する b+mean(d(cell2mat({b}):c))
そして、インデックスとして整数または論理値を持たないこと a
.
ここで評価します b/c
そしてそれが丸みを帯びた数字ではないことがわかります。
関数をオーバーロードしました
which mean
% some directoryfilename.m
何かが関数であることを実際に確認するために、このようなものを見るべきです。
a = 1:4;
b=0:0.1:1;
mean(a) = 2.5;
mean(b);
これがわかります mean
誤ってに割り当てられています。今、私たちは得ます:
which mean
% mean is a variable.
回答№2については4
Matlab(および他のほとんどのプログラミング言語)では、乗算記号は常に書く必要があります。あなたの数学の授業中にあなたはおそらくあなたが書くことができることを学びました a(a+a)
の代わりに a*(a+a)
、これはmatlabでは同じではありません。 1つ目はインデックス付けまたは関数呼び出し、2つ目は乗算です。
>> a=0
a =
0
>> a*(a+a)
ans =
0
>> a(a+a)
Subscript indices must either be real
positive integers or logicals.
回答№3の4
この質問への回答は、これまでのところこのエラーの原因に焦点を当てています。これは素晴らしいことです。しかし、Matlabのマトリックスインデックス作成の強力で直感的な機能を理解することは重要です。それゆえ 索引付けの仕組み そして 有効なインデックスとは 有効なインデックスを使用することで、このエラーを回避するのに役立ちます。
その中心で、配列を考える A
長さ n
それには2つの方法があります。
- 線形インデックス:からの整数のサブセットを持つ
1 : n
(重複可)以下の方法を使用しない限り、Matlab配列は1から始まるため、0は許可されません。高次元配列の場合、複数の添え字は内部的には 線形インデックスに変換効率的で透明な方法ですが。 - 論理インデックス:インデックス付けが真になる要素を選ぶために、0と1のn個の長さの配列を使います。この場合、unique(index)は0と1だけでなければなりません。
したがって、n個の要素を持つ別の配列への有効なインデックス配列は、次のようになります。
- まったく同じサイズの論理的なもの
- 1:nの整数のサブセットをもつ線形
これを念頭に置いて、無効なインデックスエラー2種類のインデックスを混在させると発生します。線形インデックスの配列に1つ以上のゼロが発生するか、0と1を0と1以外のもので混在させます。
これを学ぶためにオンラインでたくさんの資料があります: http://www.mathworks.com/company/newsletters/articles/matrix-indexing-in-matlab.html