【问题标题】:Matlab: select a portion of a matrixMatlab:选择矩阵的一部分
【发布时间】:2017-06-17 18:02:11
【问题描述】:

以下脚本给了我错误“下标索引必须是正整数或逻辑数。”

我不明白为什么,因为变量是整数。此外,我还将它们转换为整数。

代码是:

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。

【问题讨论】:

  • 你为什么使用int8函数?
  • int8 太小而无法包含这些值。你溢出来了。
  • 这是一个错误。使用 uint16 我仍然有同样的错误。我更新了代码和变量值。您可以在上面检查它们。还有什么想法吗?谢谢
  • 请发帖minimal reproducible example。我看不出您提供给我们的数据是如何导致该错误的。

标签: matlab indexing casting integer


【解决方案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。

【讨论】:

  • 谢谢。强制转换为 int8 是一种分散注意力的错误。然而问题不存在。仍然投射到 uint16 给我同样的错误,正如你所看到的,没有值设置为 0。还有其他想法吗?
  • 您是只这样做了一次还是多次?我仍然认为发生错误时您的值为零。你试过我回答的方法吗?
猜你喜欢
  • 2020-08-31
  • 2015-05-20
  • 2011-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-23
  • 1970-01-01
  • 2011-12-29
相关资源
最近更新 更多