在matlab中找到矩阵中具有相同值的最近元素
Find closest element with same value in matrix in matlab
考虑以下矩阵:
0 3 0 1 1 4
1 3 5 6 7 0
2 5 6 2 6 1
4 4 2 1 5 1
当我指定一个元素的位置时,我想获取与value.For例子最近的元素的位置,如果我select第3行第3列的元素,即'6',我想获得最近的'6'的行和列值,在这种情况下,它位于第2行,列4.And类似地,对于第4行的'1' ,第 4 列,最近的是第 4 行,第 5 列和第 4 行,第 6 列,其中任何一个都是 fine.I 已经查找了 'bwdist' 和 'find' 函数,但它们没有给出正确的 result.Can 有人帮我吗?
编辑:
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)
'min' 函数在这里不起作用,因为存在所需元素的每个位置都将转换为零,并且 'min' 按行扫描矩阵并给出第一个 zero.The 下面是这样的情况:
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
尽管第 4 行第 5 列中的“5”旁边有一个“5”,但第 10 行第 2 列中的“5”是 select编辑的。
假设 A
是输入二维矩阵,这可能是一种方法 -
%// 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)
这种方法不需要任何工具箱。它 returns []
如果不存在具有相同值的其他条目。
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);
考虑以下矩阵:
0 3 0 1 1 4
1 3 5 6 7 0
2 5 6 2 6 1
4 4 2 1 5 1
当我指定一个元素的位置时,我想获取与value.For例子最近的元素的位置,如果我select第3行第3列的元素,即'6',我想获得最近的'6'的行和列值,在这种情况下,它位于第2行,列4.And类似地,对于第4行的'1' ,第 4 列,最近的是第 4 行,第 5 列和第 4 行,第 6 列,其中任何一个都是 fine.I 已经查找了 'bwdist' 和 'find' 函数,但它们没有给出正确的 result.Can 有人帮我吗?
编辑:
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)
'min' 函数在这里不起作用,因为存在所需元素的每个位置都将转换为零,并且 'min' 按行扫描矩阵并给出第一个 zero.The 下面是这样的情况:
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
尽管第 4 行第 5 列中的“5”旁边有一个“5”,但第 10 行第 2 列中的“5”是 select编辑的。
假设 A
是输入二维矩阵,这可能是一种方法 -
%// 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)
这种方法不需要任何工具箱。它 returns []
如果不存在具有相同值的其他条目。
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);