2017-06-17 204 views
0

以下脚本给我提供错误“下标索引必须是真正的正整数或逻辑”。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。

+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

你只做过一次或多次?发生错误时,我仍然认为你的价值为零。你有没有在我的答案中尝试过这种方法? –