# Cell Function

17 views (last 30 days)
James on 3 Oct 2011
I've created a sliding window using the cell function. I used this as I am creating the sliding window for a daily time series of data over a few hundred years. The sliding window is 30 years long and because of leap years each row is a different length. So I now have an array of data that looks like this:
data =
10957x1 double
10957x1 double
10958x1 double
and so on...
I'm unfamiliar with the cell function however as this code was shown to me. How do I now use the data in this series? Whenever I type the command for example:
data (1,1)= 10957x1 double
But I need to do a number of things such as take the mean of each vector in the array, how do I do this?

Wayne King on 3 Oct 2011
x = {randn(1000,1), randn(1000,1), randn(1000,1)};
meanz = cellfun(@mean,x,'UniformOutput',false);
meanz = cell2mat(meanz);
Wayne King on 3 Oct 2011
you can use cellfun to do that.
Jan on 3 Oct 2011
@James: Use curly braces to access cell elements:
for 1:n, mean(data{n,1}), end
for 1:n, detrend(data{n,1}), end

Andrei Bobrov on 3 Oct 2011
data2 = cellfun(@(x){mean(x) detrend(x)},x,'un',0)
data2 = cellfun(@(x)[mean(x);detrend(x)],x,'un',0)
James on 3 Oct 2011
This just gives me the same problem?
It still outputs it as a cell array, I cant do anything with a vector where all it shows me is:
1x2 double, for every row
How can I extract the data from this as it is not currently usable?
I need to plot graphs of this data using many different functions, not just the ones I've put on here.

Wayne King on 3 Oct 2011
You can use two calls to cellfun and then use cell2mat
data1 = cellfun(@mean,x,'UniformOutput',false);
data1 = cell2mat(data1);
data2 = cellfun(@detrend,x,'UniformOutput',false);
data2 = cell2mat(data2);
Wayne King on 3 Oct 2011
Notice that data2 contains the detrended data as column vectors, which you can plot()
plot(data2)
data1 is a row vector of means
James on 3 Oct 2011
Detrend outputs a new value for each value I have. So at the moment using cell2mat the function just seems to put all 30 year period into one single column. Is there a way to define where the data goes? I have tried this but it doesn't seem to work?
detrendcell = cellfun(@(T32)detrend(T32,'linear'),T32,'un',0);
% detrends the data in each cell
n = numel(detrendcell);
for i=1:n
detrendT(i) = cell2mat(detrendcell(i));
end

Fangjun Jiang on 3 Oct 2011
Since data is a cell array, you need to use {} to reference its element, like data{1}, data{2}, data{3}, etc.
data{1} will be a 10957x1 double array, to reference its element, use data{1}(1), data{1}(100), data{1}(10957), etc.

James on 3 Oct 2011
close all
clear all
year = cet(:,1);
temp = cet(:,4);
day = cet(:,3);
month = cet(:,2);
% Loads Data from CET asc file and sets vectors
%%Constants and vectors
dates = datenum([year,month,day]);
%%30 Year Periods
StartYear=1772;
EndYear=2009;
Period=30;
T32=cell(EndYear-StartYear-Period+1,1);
for Year=StartYear:(EndYear-Period)
StartCount=datenum(Year,1,1)-datenum(StartYear,1,1)+1;
DataCount=datenum(Year+Period,12,31)-datenum(Year,12,31);
T32{Year-StartYear+1}=temp(StartCount:(StartCount+DataCount),1);
end
%%Detrend, mean etc
meancell = cellfun(@(T32)mean(T32),T32,'un',0);
meanT = cell2mat(meancell);
detrendcell = cellfun(@(T32)detrend(T32,'linear'),T32,'un',0);
n = numel(detrendcell);
for i=1:n
n1 = numel(detrendcell{i});
detrendT(:,i) = cell2mat(detrendcell{i}(1:n1));
end
James on 3 Oct 2011
This is my code and it outputs the error:
??? Cell contents reference from a non-cell array object.
Error in ==> cell2mat at 43
cellclass = class(c{1});
Error in ==> Untitled2 at 63
detrendT(:,i) = cell2mat(detrendcell{i}(1:n1));
Any idea whats wrong with it?
Fangjun Jiang on 3 Oct 2011
Why need meancell = cellfun(@(T32)mean(T32),T32,'un',0)
Can it be meancell = cellfun(@mean,T32,'un',0)

Wayne King on 3 Oct 2011
Why didn't you do what I suggested?
detrendcell = cellfun(@(T32)detrend(T32,'linear'),T32,'un',0);
detrendcell = cell2mat(detrendcell);
By the way, 'linear' is the default option for detrend:
so
detrendcell = cellfun(@detrend,T32,'UniformOutput',false);
detrendcell = cell2mat(detrendcell);
The above returns a matrix whose columns are your detrended series.
Is the same and a bit cleaner.
Wayne King on 3 Oct 2011
T32 = T32';
detrendcell = cellfun(@detrend,T32,'UniformOutput',false);
detrendcell = cell2mat(detrendcell);
James on 3 Oct 2011
This returns the error:
??? Error using ==> cat
CAT arguments dimensions are not consistent.
Error in ==> cell2mat at 77
m{n} = cat(2,c{n,:});
Error in ==> Untitled2 at 28
detrendcell = cell2mat(detrendcell)