2013-10-17 16 views
0

我對我正在嘗試解決的問題有疑問。對於每個整數,取所有值的均值

我有一個相當大的數組,有一系列數字,範圍從4,4.2,4.4和16,16.5,16.7等等在第1列中,一系列0和1在第2列對應於每個數字,例如第1列會說5和第2列會說0。下面是矩陣的一個非常小的版本,我有工作:

[5,0;5.10000000000000,0;5.20000000000000,0;5.25000000000000,0;5.30000000000000,0;5.35000000000000,0;5.45000000000000,0;5.50000000000000,0;5.55000000000000,0;5.60000000000000,0;14.2000000000000,0;5.70000000000000,0;5.80000000000000,0;5.90000000000000,0;14.0000000000000,0;14.9500000000000,1;14.8500000000000,1;14.6000000000000,1;14.3500000000000,1;14.3000000000000,1;14.2500000000000,1;14.3500000000000,1;14.2500000000000,1;14.1500000000000,1;14.0500000000000,1;] 

我想要做的就是寫代碼,平均的0和1秒的第2列爲第1列中的每個整數。我真的不知道從哪裏開始,我開始編寫一個for循環,但不確定我將如何在組2的基礎上對第2列中的一組行執行一個進程第1列中的行數是否有人有任何想法?我很抱歉,我還沒有任何示例代碼,我真的不知道該怎麼做。

+1

問題對我來說並不很清楚。你能否提供你想要的樣品輸入的輸出? '我想要做的是編寫代碼,對列1中的每個整數求平均值2的0和1。第1列有浮點數,你是如何平均的? – jkshah

+0

您說「對於列1中的每個整數」,但列1不包含整數。你是指整數部分?或者你的意思是「對於第1列中的每個數字」? –

回答

2

如果我理解正確的話,你想要的第二列的所有值的平均值在第一列中有相同的整數部分。

您可以通過對a previous question的答案進行輕微修改來實現此目的。讓x成爲您的數據(2列,任意數量的行)。然後:

x1_int = floor(x(:,1)); 
[value_sort ind_sort] = sort(x1_int); 
[~, ii, jj] = unique(value_sort); 
n = diff([0; ii]); 
result = [ x1_int(ii) accumarray(jj,x(ind_sort,2))./n ]; 

如果使用Matlab 2013a或更新版本,請將第三行替換爲以下內容。這是必要的,因爲unique功能在Matlab 2013a被改變:

[~, ii, jj] = unique(value_sort,'legacy'); 

可變result包含在其第1列的x 1列的整數部分,並在其第2欄第2欄的相應的平均x。有了您的示例數據:

x= [5.0000   0 
    5.1000   0 
    5.2000   0 
    5.2500   0 
    5.3000   0 
    5.3500   0 
    5.4500   0 
    5.5000   0 
    5.5500   0 
    5.6000   0 
    14.2000   0 
    5.7000   0 
    5.8000   0 
    5.9000   0 
    14.0000   0 
    14.9500 1.0000 
    14.8500 1.0000 
    14.6000 1.0000 
    14.3500 1.0000 
    14.3000 1.0000 
    14.2500 1.0000 
    14.3500 1.0000 
    14.2500 1.0000 
    14.1500 1.0000 
    14.0500 1.0000] 

結果是

result = 

    5.0000   0 
    14.0000 0.8333 
2

我會做這樣的事情:

integers = floor(inputMatrix(:,1)); 
uniqueIntegers = unique(integers); 
K = numel(uniqueIntegers); 

outputMean = nan(1,K); 
for k = 1:K 
    outputMean(k) = mean(inputMatrix(integers==uniqueIntegers(k),2))); 
end 

其中inputMatrix高於你的矩陣。用簡單的英語,將第一列轉換爲floor函數的整數,挑出唯一值,然後遍歷唯一值並使用邏輯索引查找均值。兩個矢量uniqueIntegersoutputMean分別包含那些整數和第二列的平均值。

正如評論中所建議的,我認爲有幾種方法可以閱讀這個問題。首先,如上面所回答的,OP想要將小數點左側5位的所有數據平均到一起。

然而,如果該OP希望只有那些含有5(或其它整數)值平均在一起,然後在環與取代的值:但是,如果該OP希望

outputMean(k) = mean(inputMatrix(inputMatrix(:,1)==uniqueIntegers(k),2))); 

以平均含有一個整數,無論​​值是什麼都值加在一起,然後整個代碼塊可以被簡化爲:

integers = floor(inputMatrix(:,1)) == inputMatrix(:,1); 
outputMean = mean(inputMatrix(integers,2)); 
+0

是有道理的,但由於第1列中的所有值都是唯一的,所以發佈的矩陣是沒有意義的... – chappjc

+0

OP表示他希望對第1列中的每個整數求平均值,這就是爲什麼我包含「floor」語句以將所有值降低。 – craigim

+0

我明白了。我不會承擔發言權,但這樣做是有道理的。 +1 – chappjc

相關問題