shifting without for loop

2 Ansichten (letzte 30 Tage)
Housam
Housam am 22 Jul. 2019
Kommentiert: Housam am 23 Jul. 2019
Hello,
I have two cells each 60x23 and each cell consist of columns with different length.
For each cell, I need
1- Get ten values starting from last values,
2- Apply fitlm function on the obtained values
3- Get the Coefficients {2,1} of the fitlm
4- omit the last value in step1, shift one value and get ten elements. Then repeat steps 2and3. (hopefully without for loops as i found it complicated with cells having variable lengths).
5- Goal: obtain a 60x23 cell where each cell has the Coefficients of linear regression for each ten values.
My attempted solution works till step 3 as shown:
Time2sec = lst2val % 60x23 cell
delta2sec = delta.delta % 60x23 cell
len0 = cellfun(@length, Time2sec, 'uni',0)
len1 = cellfun (@(x) x-9, len0, 'uni',0)
%len1 = cellfun (@(x) x-10, len0,'uni',0)
len2 = cellfun (@(x) x+9, len1, 'uni',0)
last10frames = cellfun (@(x,y1, y2) x( y1:y2 ), Time2sec, len1, len2 , 'Uni',0)
len00 = cellfun(@length, delta2sec, 'uni',0)
len11 = cellfun (@(x) x-9, len00,'uni',0)
len22 = cellfun (@(x) x+9, len11, 'uni',0)
last10frames_2 = cellfun (@(x,y1, y2) x( y1:y2 ), delta2sec, len11, len22 , 'Uni',0)
reg0 = cellfun (@fitlm, last10frames, last10frames2, 'uni',0)
M_value = cellfun (@(x) x.Coefficients{2,1}, reg0 , 'uni', 0)
% omit value, shift with step -1 till first element in each cell and apply linear regression.
I really appreciat the help.
  5 Kommentare
the cyclist
the cyclist am 22 Jul. 2019
For a given cell location (e.g. i=9, j=13), do Time2sec and delta2sec always have the same length?
Housam
Housam am 22 Jul. 2019
yes, also correct @the cyclist

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

the cyclist
the cyclist am 22 Jul. 2019
Bearbeitet: the cyclist am 22 Jul. 2019
If the vectors in the corresponding cell arrays are equal in length, then this straightforward code should work:
M = 60;
N = 23;
MIN_VEC_SIZE = 10;
MAX_VEC_SIZE = 30;
% Make up some data
rng default
Time2sec = cell(M,N);
delta2sec = cell(M,N);
M_value = cell(M,N);
Time2sec = cellfun(@(x)randn(max(MIN_VEC_SIZE,randi(MAX_VEC_SIZE)),1),Time2sec,'uni',false);
delta2sec = cellfun(@(x)randn(size(x)),Time2sec,'uni',false);
% Calculate the regressions
for ii = 1:M
for jj = 1:N
numberRegressionsThisCell = numel(Time2sec{ii,jj})-9;
M_value{ii,jj} = zeros(numberRegressionsThisCell,1);
for nr = 1:numberRegressionsThisCell
mdl = fitlm(Time2sec{ii,jj}(nr:nr+9),delta2sec{ii,jj}(nr:nr+9));
M_value{ii,jj}(nr) = mdl.Coefficients{2,1};
end
end
end
(If not, this code could be easily modified to accommodate that.)
The vast majority of the execution time is spent doing the regressions, so there will likely be little advantage in excising the for loops.
  1 Kommentar
Housam
Housam am 23 Jul. 2019
Thank you! it works good.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Kategorien

Mehr zu Loops and Conditional Statements finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by