2010-07-19 65 views
2

我有一個矩陣A,它保存有界範圍內的整數(0..255),我需要構建一個將一個值(0..255)映射到所有座標中的表格保存這個值的矩陣。從Matlab中的矩陣構建地圖

達到此目的的最佳方法是什麼? - 我想過使用containers.Map來完成任務,但Map不支持每個鍵的多個值。我可以使用列表,但這似乎效率低下,因爲我不得不在每次迭代中創建一個新列表。

回答

1

矢量化的解決方案,可以得到相同的輸出作爲the solution from Mikhail,是在圖像的所有像素值使用SORT功能,排序轉換線性指數從返回0到下標索引使用函數IND2SUB,並收集在一起成一個單一的單元陣列使用函數ACCUMARRAYMAT2CELL

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矩陣

key = double(iValue)+1; %# Need to use double to avoid integer saturation 
points = map{key};  %# An N-by-2 coordinate matrix 

此外,只是I:含有y(第一列)和x(第二列)的圖像中的與該值通過執行以下操作座標爲N像素你有興趣ñ情況下,你也可以使用函數STRUCT使map結構陣列領域xy

map = struct('x',mat2cell(x,counts),'y',mat2cell(y,counts)); 

然後你就可以訪問xy座標與像素值iValue如下:

key = double(iValue)+1; 
x = map(key).x; 
y = map(key).y 
0

如何使用單元陣列?你可以用整數索引它。例如:

map = {[1,1;13,56], [], [4,5]}; 

在這個例子中索引爲0是在4,5

1,113,56,在沒有和索引2索引1處的矩陣你的細胞將具有256個元素(礦有3個),並你只需要在索引中加1即可。

你也可以線性存儲指數因此代碼填寫該表將是:

for ii = 0:255 
    map{ii+1} = find(mat(:)==ii) 
end 
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 

訪問表是有點annoyting雖然:

AGT{200}{2}{:} 

訪問所有與座標值200.