2017-06-17 21 views
0

次のスクリプトでは、「添え字インデックスは正の整数または論理でなければなりません」というエラーが表示されます。Matlab:行列の一部を選択

なぜvarsが整数なのかわかりません。さらに、私も整数にキャストします。

コードは次のとおりです。

x_start = int16(x-matrixRay); 
     x_end = uint16(x+matrixRay); 
     y_start = uint16(y-matrixRay); 
     y_end = uint16(y+matrixRay); 
     matrix = img(x_start:x_end,y_start:y_end); 

私は上記のコードの前にブレークポイントを置きます。私は、変数の値をリストの下:それはかなり大きいので、

K>> x_start 

x_start = 

    uint16 

    298 

K>> x_end 

x_end = 

    uint16 

    302 

K>> y_start 

y_start = 

    uint16 

    88 

K>> y_end 

y_end = 

    uint16 

    92 

K>> matrixRay 

matrixRay = 

    2 

は、明らかに私は、すべての行列「IMG」を投稿することはできません。ワークスペースは1369x1173 uint8です。

+0

なぜint8関数を使用していますか? – jrook

+1

'int8'は小さすぎてこれらの値を格納できません。あなたはあふれています。 – beaker

+0

間違いでした。 uint16では、私はまだ同じエラーがあります。コードと変数の値を更新しました。あなたは上のそれらをチェックすることができます。他のアイデア?ありがとう – user1315621

答えて

2

他の人が指摘しているように、int8(-128〜127)は明らかに画像サイズをカバーしません。サイズを指定すると、索引にuint16を使用できます。索引付けに符号付き整数を使用することはあまり意味がありません。整数ではない場合があるため、単純にroundを使用してインデックスを作成することができます。

しかしint8はあなたに間違った結果を与えます(私の意見ではエラーより悪い)。エラーは、x_startまたはy_startがゼロであるためです。これはブレークポイントを設定することで簡単に確認できます。

あなたが何をしていることは、あなたが望むものであることを確認している場合、あなたはこのような問題を解決することがあります。

x_start = round(x-matrixRay); % or uint16 if size is less than 2^16 
x_start = max(x_start, 1); % use 1 if less than 1 
x_end = round(x+matrixRay); 
x_end = min(x_end, size(img,1)); % clip to max of img size 

同様のがy_startとy_endするために適用されるべきです。

+0

ありがとうございます。 int8へのキャストは一種の気晴らしミスでした。しかし問題はそこにありません。 uint16にキャストしても同じエラーが表示されます。ご覧のとおり、値は0に設定されていません。 – user1315621

+0

これは1回だけ、または複数回実行しましたか?私はまだあなたがエラーが発生したときに値ゼロを持っていると思う。私の答えでこの方法を試しましたか? –

関連する問題