2013-04-12 67 views
2

排序我具有由1列例如(大型簡化)排序21128x9單元的單元陣列的第一n個值的:MATLAB:獲取意味着由第一列

A=[1 3; 1 5; 1 3; 2 1; 2 2; 2 3; 3 5; 3 5] 

    A = 

     1  3 
     1  5 
     1  3 
     2  1 
     2  2 
     2  3 
     3  5 
     3  5 

其中第1列中的某些值被重複超過其他。

我想要做的是獲得第一列的每個值的第二列的平均值,但只爲前兩個值。

ans= 1 4 
     2 1.5 
     3 5 

我試圖用這個基本功能

means = accumarray(A(:,1) ,A(:,2),[],@mean); 

,但我不知道如何得到它僅適用於各組的前兩個值。我想我需要一個環路,東西線沿線的:

for ; 
     means = accumarray(A(:,1) ,A(:,2),[],@mean); 
    end 

什麼我不知道什麼是什麼必須這樣做。

回答

4

accumarray傳遞載體導入匿名函數,所以你可以做,例如:

A = [1 3; 1 5; 1 3; 2 1; 2 2; 2 3; 3 5; 3 5]; 
maxAvgs = 3; 
accumarray(A(:, 1), A(:, 2), [], @(x)mean(x(1:min(length(x), maxAvgs)))) 

ans = 

3.6667 
2.0000 
5.0000 

maxAvgs = 2; 
accumarray(A(:, 1), A(:, 2), [], @(x)mean(x(1:min(length(x), maxAvgs)))) 

ans = 

4.0000 
1.5000 
5.0000 

當你準備在涉及匿名函數這種情況下不能確定,你可以寫你的匿名函數作爲@(varargin)disp(varargin);這將顯示輸入參數。在這種情況下,這不起作用,因爲accumarray要求您傳遞它的函數返回一個參數。但是,您仍然可以將其設置爲匿名函數並從腳本運行代碼;在編輯器窗口的行上設置一個斷點,確保爲斷點的位置選擇「匿名函數」。

編輯:

在我的實際數據,有的有60個值,有的有120,有些有180 作爲補充,是有可能再上 下次運行均值函數很多值(即值61-120,然後121-180)?

要你,你在評論問什麼我建議創建一個功能splitMean並通過這accumarray

function y = splitMean(x, n) 
% If length of x doesn't divide by n, the extra elements will be averaged 
% separately 
extra = mod(length(x), n); 
M = length(x)-extra; 

meanData = reshape(x(1:M), M/n, n); 

extraMean = []; 
if extra > 0, extraMean = mean(x(M+1:end)); end 
if ~isempty(meanData) 
    y = {[mean(meanData).'; extraMean]}; 
else 
    y = {extraMean}; 
end 

然後,

maxAvgs = 2; 
cell2mat(accumarray(A(:, 1), A(:, 2), [], @(x)splitMean(x, maxAvgs))) 

ans = 

4.0000 
3.0000 
1.5000 
3.0000 
5.0000 

%%% Without the cell2mat: 

ans = 

[2x1 double] 
[2x1 double] 
[   5] 

這樣一來,你的所有每組可以一次提供所有組。請注意0​​。如果你想讓它們按組索引分割,那麼刪除它就會得到一個單元格數組。

+0

啊!主席先生,你是一位學者和紳士!這似乎很簡單,但我想我還沒有完全掌握MATLAB語法。 – 8eastFromThe3ast

+0

在我的實際數據中,一些有60個值,有些有120個,有些有180個。作爲補充,是否有可能在下一批值上運行平均函數(即值61-120,然後121-180) ? – 8eastFromThe3ast

+0

輝煌,謝謝!你是個明星! – 8eastFromThe3ast