Matlab: выберите часть матрицы
Следующий скрипт дает мне ошибку "Индексы нижнего индекса должны быть либо натуральными положительными целыми числами, либо логическими".
Я не понимаю, почему, поскольку переменные являются целыми числами. Более того, я также приведу их к целым числам.
Код является:
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.
1 ответ
Как уже отмечали другие, 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.