我有一个矩阵A,其中保存有界范围(0..255)中的整数,并且我需要构建一个表,将值(0..255)映射到矩阵中所有包含此值的坐标。
实现此目标的最佳方法是什么? -我考虑过将container.Map用于任务,但Map不支持每个键使用多个值。我本可以使用列表,但这似乎效率很低,因为我必须在每次迭代中创建一个新列表。
回答:
一个向量化的解决方案,其输出
与Mikhail的解决方案相同,其输出是使用
SORT函数对图像中的所有像素值进行
排序 ,使用函数
IND2SUB将
SORT返回的线性索引转换为下标索引,并将它们一起收集到使用
ACCUMARRAY和
MAT2CELL函数的单个单元格数组:
A = randi([0 255],[5 5],'uint8'); %# A sample matrix [values,indices] = sort(double(A(:))); %# Sort all the pixel values [y,x] = ind2sub(size(A),indices); %# Convert linear index to subscript counts = accumarray(values+1,1,[256 1]); %# Count number of each value map = mat2cell([yx],counts); %# Create a 256-by-1 cell array 现在,对于整数值给定iValue就可以得到N -by-2包含基质y (第一列)和x (第二列)的坐标为N与通过执行以下操作该值的图像中的像素:
key = double(iValue)+1; %# Need to use double to avoid integer saturation points = map{key}; %# An N-by-2 coordinate matrix 此外,以防万一,您还可以使用函数
STRUCT将map构造为具有字段x和y的结构数组:
map = struct('x',mat2cell(x,counts),'y',mat2cell(y,counts)); 然后,您可以按如下所示访问值为iValue像素的x和y坐标:
key = double(iValue)+1; x = map(key).x; y = map(key).y
更多&回答...