使用最小的索引

时间:2017-12-10 21:42:26

标签: indexing octave min

我的问题是我已经将图片中的点距离计算到三个静态点。我想知道哪个距离最小,并将像素的值写入第二个数组。我使用min()来获取索引,但我不知道如何使用这些索引访问图片。我简化了一些代码:

data = rand(5, 5, 3);          # distances of a 5x5 image to 3 different points
[~, mi] = min(data, [], 3);    # which of the distances is the minimum
result = picture(mi);          # write pixel values to result

我知道这只会给我picture(1:3, 1, 1)的值,所以前三个像素,我没有找到适合转换指标的函数。我怎样才能实现这一点并避免编写循环?

修改

清除。 mi可能是

data = rand(3, 3, 2)
data = 
ans(:, :, 1) = 
    0.316498   0.054937   0.606390
    0.537073   0.231184   0.790371
    0.770788   0.334282   0.522369

ans(:,:,2) =
   0.843369   0.051667   0.227570  
   0.452298   0.407662   0.648079
   0.450546   0.398068   0.281694

[~, mi] = min(data, [], 3)
mi =
   1   2   2
   2   1   2
   2   1   2

data(mi)
ans =
   0.31650   0.53707   0.53707
   0.53707   0.31650   0.53707
   0.53707   0.31650   0.53707

正如您所看到的,我只访问了data(1)data(2)这些基本data(1, 1, 1)data(2, 1, 1)的内容,但我希望能够结果如下

0.31650    0.051667   0.227570  
0.452298   0.231184   0.648079
0.450546   0.334282   0.281694

1 个答案:

答案 0 :(得分:0)

在此上下文中min的返回为您提供了最小值出现的矩阵切片,这是预期的结果,但不一定是最有用的结果。您可以使用sub2indmeshgrid生成linear indices来访问您的最低位置:

tmp = rand(3, 3, 2);
[mins, mi] = min(tmp, [], 3);

[r, c, ~] = size(tmp);  % Get number of rows & columns
[y, x] = meshgrid(1:r, 1:c);  % Generate x,y pairs
lidx = sub2ind(size(tmp), x(:), y(:), mi(:));  % Generate linear indices

% Test out the linear indices
mins_lidx = reshape(tmp(lidx), r, c);  % Reshape to the slice size

其中

>> all(mins(:)==mins_lidx(:))

ans =

  logical

   1

如果需要,您也可以使用下标[x(:), y(:), mi(:)],但在这种情况下似乎更难以使用。