Subscript indices must either be real positive integers or logicals.

1 view (last 30 days)
med-sweng on 8 Feb 2015
Answered: Image Analyst on 8 Feb 2015
I get returned from a function I call the "pixel location".
At that location, what I try to do is:
A(pixel_location(1),pixel_location(2))=1;
But, I get the following error:
Subscript indices must either be real positive integers or logicals.
Why is that? How can I solve this issue?

Star Strider on 8 Feb 2015
Your ‘pixel_location’ vector likely contains values that are not integers greater than 0. Negative values, non-integer values, and zero are not valid subscripts in MATLAB array indexing.
Star Strider on 8 Feb 2015
A conditional statement might be able to check to be certain that particular pairs from ‘pixel_location’ are positive integers, but what does that do to your code?
I would see what ‘pixel_location’ contains, and correct it if possible. For instance if it contains integers with negative values or zero, adding a positive offset to be the minimum of ‘pixel_location’+1 would correct the problem. (You may have to make appropriate changes elsewhere in your code to account for that.) If it contains non-integer values, you would have to make other changes (perhaps scaling and rounding) to make them work as indices.
Since I don’t know what ‘pixel_location’ contains, I cannot be more specific than that.

Erik S. on 8 Feb 2015
Check the values of pixel_location(1) and pixel_location(2). I guess you find either the value 0 or a decimal value. Indexes have to be integers.
Erik S. on 8 Feb 2015
If you can formulate a conditional statement which is updated each iteration as well it could work. But if you don't know which values are correct for pixel_location in each iteration it seems difficult.

Image Analyst on 8 Feb 2015
Try to round the values (if they might be fractional values) and clip the values to between your image limits:
[rows, columns, numberOfColorChannels] = size(yourImage);
pixel_location = round(pixel_location) % Round.
pixel_location(1) = min(pixel_location(1), rows); % Don't allow more than rows.
pixel_location(1) = max(pixel_location(1), 1); % Don't allow less than 1.
pixel_location(2) = min(pixel_location(2), columns); % Don't allow more than columns.
pixel_location(2) = max(pixel_location(2), 1); % Don't allow less than 1.