Looping over an array using Fibonacci numbers as a range to calculate the mean

3 visualizzazioni (ultimi 30 giorni)
Good day,
I have a 2 million x1 double array - doublearray1. I have a second 5x 1 double array containing Fibonacci numbers, more specifically[3,5, 8,13,21] - doublearray2. Note, doublearray2 can change using the Matlab fibonacci function. doublearray2 = fibonacci(n:m).
I would like to loop over doublearray1 and calculate the mean for a range of values in doublearray1, using doublearray2. The mean will be stored in doublearray3
The loop will run as follows:
doublearray3(1-5,1) = mean(doublearray1(1:1+3)) then mean(doublearray1(4:4+5)) then mean(doublearray1(9:9+5)) then mean(doublearray1(14:14+13)) then mean(doublearray1(27:27+21))
doublearray3(5-10,1) = mean(doublearray1(48: 48+3)) then mean(doublearray1(51:51+5)) then mean(doublearray1(56:56+8)) then mean(doublearray1(64:64+13)) then mean(doublearray1(77:77+21))
... doublearray3(2000000, 1)
I would appreciate any help with the code for this.
Thanks
  3 Commenti
DavidSmuts
DavidSmuts il 5 Gen 2022
Thanks for the response. Apologies for the misunderstanding.I do not have much experience using Matlab. doublearray3(row index 1 to 5) is what I mean - there are five values in the fibonacci array. Agree with you to substitute doublearray1 to "a", doublearray2 to "b", doublearray3 to "c". Thanks.

Accedi per commentare.

Risposta accettata

Jan
Jan il 5 Gen 2022
Modificato: Jan il 5 Gen 2022
What should happen with the last chunk, if you cannot find enough elements in the input data?
Should the 1st term really be: mean(doublearray1(1:1+3)), so it is the mean over 4 elements, not 3?
The element 4 is included in the first mean value and in the second one also?
In your description the element doublearray3(5) is defined as last element of the first block and first element of the second block again: "doublearray3(1-5,1)=..." and "doublearray3(5-10,1)". Is the wanted?
Here a code, which calculates the mean over 3, 5, 8, ... elements without overlap:
pool = [3, 5, 8, 13, 21];
data = rand(2e6, 1);
npool = numel(pool);
out = zeros(numel(data), 1); % Pre-allocate too much memory
i1 = 1; % Start of current chunk
ndata = numel(data);
k = 0;
while i1 <= ndata
n = pool(rem(k, npool) + 1); % Get next element from pool
i2 = min(i1 + n - 1, ndata); % End of current chunk
k = k + 1; % Index of output
out(k) = sum(data(i1:i2)) / (i2 - i1 + 1);
i1 = i2 + 1; % Start is current End + 1
end
out = out(1:k); % Crop unneded elements

Più risposte (0)

Categorie

Scopri di più su Creating and Concatenating Matrices in Help Center e File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by