我有一个矩阵A,它在有界范围内保存整数(0..255),我需要构建一个表格,将值(0..255)映射到矩阵中保存该值的所有坐标。
实现这一目标的最佳方法是什么? - 我考虑过使用containers.Map来完成任务,但Map不支持每个键的多个值。我可以使用列表,但这似乎效率低下,因为我必须在每次迭代时创建一个新列表。
答案 0 :(得分:1)
矢量化解决方案提供与the solution from Mikhail相同的输出,是使用SORT函数对图像中的所有像素值进行排序,将从SORT返回的线性索引转换为使用函数IND2SUB的下标索引,并使用函数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([y x],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));
结构数组:
x
然后,您可以访问值y
的像素的iValue
和key = double(iValue)+1;
x = map(key).x;
y = map(key).y
坐标,如下所示:
{{1}}
答案 1 :(得分:0)
使用单元阵列怎么样?您可以使用整数对其进行索引。例如:
map = {[1,1;13,56], [], [4,5]};
在此示例中,索引0位于1,1
和13,56
的矩阵中,索引1中为无,索引2位于4,5
你的单元格将包含256个元素(我的单元格有3个元素),只需将1添加到索引中即可。
您还可以线性存储索引,以便填充表格的代码为:
for ii = 0:255
map{ii+1} = find( mat(:)==ii )
end
答案 2 :(得分:0)
好吧,我写了以下内容,似乎在合理的时间内工作。我认为解决这个问题的方法是根据每个值的直方图预先分配单元格数组:
[H, W] = size(A);
histogram = hist(A, 256);
AGT = arrayfun(@(avg) {0 cell(1, histogram(avg))}, 1:256, 'UniformOutput', false);
for y = 1:H
for x = 1:W
idx = A(y, x) + 1;
count = AGT{idx}{1};
AGT{idx}{2}{count + 1} = [y x];
AGT{idx}{1} = count + 1;
end
end
访问该表有点烦人:
AGT{200}{2}{:}
访问值为200的所有坐标。