2017-09-25 97 views
1

我是Matlab新手,爲了完成一項任務,我的教授正在寫一個自定義的Matlab函數(用於從一組數據生成直方圖)。基本上正在創建一個新的矢量,L正在用來自2D矩陣M的信息進行更新。第一列L包含來自M(i,j)的信息,第二列包含數據集中的計數(總計)M(i,j)。關於下一步如何進行,我需要一些指導。Matlab直方圖函數

下面是我在哪裏迄今:

function L = hist_count(M) 

L = [ [0:255' zeros(256,1) ]; 
for i = 1:size(M,1) 
    for j = 1:size(M,2) 
     L(double(M(i,j))+1,2) = <<finish code here>>; 
    end 
end 

figure; 
plot(L(:1),L(:2)); 

<<finish code here>>部分中,我堅持。我瞭解一切,直到我需要更新L的信息。

幫助表示讚賞。

+0

您的括號在初始化「L」時不匹配。爲什麼你將索引增加到直方圖?您應該修改當前索引的*值*。 – beaker

回答

3

注意:您的直方圖L的初始化有括號不匹配。 刪除代碼中的第二個[括號。另外,創建0:255矢量不正確。做0:255'轉換爲255的單個常量,這意味着它仍然會創建一個水平向量0:255,這將導致代碼失敗。你應該圍繞創造這個向量與parantheses,然後轉置那個結果。因此:

L = [ (0:255)' zeros(256,1) ]; 

現在到你的實際問題。通過初始化直方圖來判斷,有256個可能的值,因此您的輸入最有可能是uint8類型,這意味着數據中的值將僅爲[0-255],步驟爲1.請記住,直方圖記錄的總數次你看到一個值。在這種情況下,您有兩列矩陣,第一列告訴您要檢查的值,第二列告訴您在數據中看到了多少次該值。因此,每一行都會告訴您在您的數據中您正在檢查哪個值,以及您在數據中看到過多少次該值。請注意,計數全部初始化爲零,因此邏輯是每次看到一個值時,都需要訪問與該數據點對應的右側行,然後將該值增加1.

因此,行僅僅是剛剛訪問當前的計數和增加1到它...你然後將其存儲回:

L(double(M(i,j))+1,2) = L(double(M(i,j))+1,2) + 1; 

M(i,j)是在你的二維數據在位置(i,j)找到的值。最後一個問題是爲什麼把強度改爲double並添加1?您投到double,因爲輸入可能是整數類型。這意味着任何超出該類型動態範圍的值都會變得飽和。因爲輸入的類型爲uint8,任何超過255的值都會飽和到255.在MATLAB中,我們將索引從1開始的矩陣的行和列中,因爲這些值可能會從值0開始,這對應於您的直方圖的第1行所以你必須偏移1.當例如uint8類型的數值達到最極端情況值255時,使用原生uint8將1加到該值將會飽和到255,這意味着254和255的值被集中到同一個bin。因此,您必須將其轉換爲超出uint8限制的某種類型,然後再加1以避免飽和。 double通常在此處作爲默認值完成,因爲它的精度高於uint8,但精度高於uint8的任何類型都適用。

+0

謝謝你的迴應,這是非常有益的。但是,由於出現錯誤,我目前無法完全實現:'使用horzcat的錯誤串聯的矩陣的維度不一致。你能幫助向我展示如何從這裏出發? –

+0

啊,那是因爲'0:255'的矢量是錯誤的。請把它包圍起來:'(0:255)''。發生的事情是,它通過調換單個常量255來創建水平向量,這是不正確的。我會更新我的帖子。 – rayryeng

+0

啊!對我來說,我認爲這就是爲什麼[被誣衊,應該有兩個圍繞'0:255'的原因。工作完美!謝謝! –