简体   繁体   English

在matlab中查找矩阵中具有相同值的最接近元素

[英]Find closest element with same value in matrix in matlab

Consider the following matrix: 考虑以下矩阵:

0 3 0 1 1 4
1 3 5 6 7 0
2 5 6 2 6 1
4 4 2 1 5 1

When I specify the position of an element, I would like to obtain the position of the nearest element with the same value.For example, if I select the element in row 3,column 3, ie '6', I would like to obtain the the row and column values of the nearest '6',in this case, it is at row 2, column 4.And similarly, for the '1' at row 4,column 4, the nearest is at row 4,col 5 and row 4,col 6, any one of them is are fine.I have looked up the 'bwdist' and 'find' functions but they don't give the proper result.Can anyone help me on this? 当我指定一个元素的位置时,我想获得具有相同值的最近元素的位置。例如,如果我选择第3行第3列中的元素,即“ 6”,则我想获得最接近的'6'的行和列的值,在这种情况下,它位于第2行的第4列。同样,对于第4列的第1列的'1',最接近的是第4行,列5第4,col 6行,它们中的任何一个都很好。我查询了'bwdist'和'find'函数,但它们没有给出正确的结果,有人可以帮我吗?

Edit: 编辑:

a1 = randi(10,10,5); 
disp(a1);
%// For an array of search numbers
search_array = a1(4,5);
disp(search_array);
%%// Find the linear index of the location
[~,ind] = min(abs(bsxfun(@minus,a1(:),search_array')));%//'

%%// Convert the linear index into row and column numbers
[x,y] = ind2sub(size(a1),ind) 

The 'min' function will not work here as each position where the required element is present will be converted to zero and 'min' scans the matrix row-wise and gives the position of the first zero.The following is such a case: ``min''函数在这里不起作用,因为存在所需元素的每个位置都将转换为零,并且``min''逐行扫描矩阵并给出第一个零的位置。以下是这种情况:

 2     6    10     9     2
 6     6     7     5     3
 1     8     5     2     1
 8     1     9     5     5
 9     7     6     4     3
10     6     6     5     3
10     2     7     9     5
 6    10     4     5     2
 3     6     3     4     5
 2     5     6     4     8

Even though there is a '5' right next to the '5' in row 4,col 5,the '5' in row 10, column 2 is selected. 即使第4行第5行中的“ 5”旁边有一个“ 5”,第10行第2列中的“ 5”也会被选中。

Assuming A to be the input 2D matrix, this could be one approach - 假设A是输入2D矩阵,这可能是一种方法-

%// Row and column indices of the "pivot"
row_id = 4;
col_id = 5;

%// Get the linear index from row and column indices
lin_idx = sub2ind(size(A),row_id,col_id)

%// Logical array with ones at places with same values
search_matches = false(size(A));
search_matches(A==A(lin_idx)) = 1;

%// Create a logical array with just a single 1 at the "pivot"
A_pivot = false(size(A));
A_pivot(lin_idx) = 1;

%// Use BWDIST to find out the distances from the pivot to all the places
%// in the 2D matrix. Set the pivot place and places with non-similar
%// values as Inf, so that later on MIN could be used to find the nearest
%// same values location
distmat = bwdist(A_pivot)
distmat(lin_idx) = Inf
distmat(~search_matches)=Inf

[~,min_lin_idx] = min(distmat(:))
[closest_row_idx,closest_col_idx] = ind2sub(size(A),min_lin_idx)

This approach doesn't require any toolbox. 这种方法不需要任何工具箱。 It returns [] if no other entry with the same value exists. 如果不存在其他具有相同值的条目,则返回[]

A = [0 3 0 1 1 4
     1 3 5 6 7 0
     2 5 6 2 6 1
     4 4 2 1 5 1];                     %// data matrix
pos_row = 3;                           %// row of reference element
pos_col = 3;                           %// col of reference element

ref = A(pos_row,pos_col);              %// take note of value
A(pos_row,pos_col) = NaN;              %// remove it, to avoid finding it as closest
[ii, jj] = find(A==ref);               %// find all entries with the same value
A(pos_row,pos_col) = ref;              %// restore value
d = (ii-pos_row).^2+ (jj-pos_col).^2;  %// compute distances
[~, ind] = min(d);                     %// find arg min of distances
result_row = ii(ind);                  %// index with that to obtain result
result_col = jj(ind);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM