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。如果你想讓它們按組索引分割,那麼刪除它就會得到一個單元格數組。
啊!主席先生,你是一位學者和紳士!這似乎很簡單,但我想我還沒有完全掌握MATLAB語法。 – 8eastFromThe3ast
在我的實際數據中,一些有60個值,有些有120個,有些有180個。作爲補充,是否有可能在下一批值上運行平均函數(即值61-120,然後121-180) ? – 8eastFromThe3ast
輝煌,謝謝!你是個明星! – 8eastFromThe3ast