Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MATLAB中计算海量数据均值的有效方法_Matlab - Fatal编程技术网

MATLAB中计算海量数据均值的有效方法

MATLAB中计算海量数据均值的有效方法,matlab,Matlab,我有一个来自上一个模拟的输出,其中有32872行和1000列。行表示90年的每日数据,列表示90年的不同数据集。我想做的是分别计算每年的平均值和标准差。例如,我正在做的是: %for year 1 a=mean2(RAINFALL(1:365,:)); b=std2(RAINFALL(1:365,:)); %for year 2 a=mean2(RAINFALL(366:730,:)); b=std2(RAINFALL(366:730,:)); . . . . %for year 90 a=m

我有一个来自上一个模拟的输出,其中有32872行和1000列。行表示90年的每日数据,列表示90年的不同数据集。我想做的是分别计算每年的平均值和标准差。例如,我正在做的是:

%for year 1
a=mean2(RAINFALL(1:365,:));
b=std2(RAINFALL(1:365,:));

%for year 2
a=mean2(RAINFALL(366:730,:));
b=std2(RAINFALL(366:730,:));
.
.
.
.
%for year 90
a=mean2(RAINFALL(32508:32872,:));
b=std2(RAINFALL(32508:32872,:));
我做的是每年手动计算,所以我必须手动计算大约90次。问题是我有大约100个这样的数据集。我是否可以通过自动或使用回路或MATLAB中的其他任何函数来执行此操作,以简化此过程并将输出数据存储在一个矩阵中,例如:

这样我就不用手动操作了?我对MATLAB编程还不熟悉,希望MATLAB专家能给我建议如何有效地解决这个问题。我真的很感谢你的帮助,因为这是我的硕士论文项目。
感谢您执行循环:

for i=365:365:32872
  a=mean2(RAINFALL(i:i+365-1,:));
  b=std2(RAINFALL(i:i+365-1,:));
end

对于循环实现:

for i=365:365:32872
  a=mean2(RAINFALL(i:i+365-1,:));
  b=std2(RAINFALL(i:i+365-1,:));
end

for
循环可以帮助您-

R = rand(32872,90); % replace this with your rainfall data
startyear = 2010; % according to your comments

% generate array indices
nod = 365*ones(90,1) ... % number of days in each year
    +(mod((startyear:(startyear+89))',4)==0);
ind(:,2) = cumsum(nod);
ind(:,1) = [0; ind(1:end-1,2)]+1;

% find stats
a = zeros(90,1);
b = zeros(90,1);
for ii = 1:90
    yeardata = R(ind(ii,1):ind(ii,2),:);
    a(ii) = mean2(yeardata);
    b(ii) = std2(yeardata);
end
请注意,这里的难点是正确处理闰年

如果您没有图像处理工具箱,其中包括
mean2
std2
,则

    a(ii) = mean(yeardata(:));
    b(ii) = std(yeardata(:));

for
循环可以帮助您-

R = rand(32872,90); % replace this with your rainfall data
startyear = 2010; % according to your comments

% generate array indices
nod = 365*ones(90,1) ... % number of days in each year
    +(mod((startyear:(startyear+89))',4)==0);
ind(:,2) = cumsum(nod);
ind(:,1) = [0; ind(1:end-1,2)]+1;

% find stats
a = zeros(90,1);
b = zeros(90,1);
for ii = 1:90
    yeardata = R(ind(ii,1):ind(ii,2),:);
    a(ii) = mean2(yeardata);
    b(ii) = std2(yeardata);
end
请注意,这里的难点是正确处理闰年

如果您没有图像处理工具箱,其中包括
mean2
std2
,则

    a(ii) = mean(yeardata(:));
    b(ii) = std(yeardata(:));

为了选择年份,我认为利用MATLAB的日期函数是最安全的,因为它已经知道闰年的所有规则

data = rand(32872,100); % replace with your data matrix

[nDays,nData] = size(data);

% let MATLAB construct the vector of dates and worry about things like leap
% year.
dayFirst = datenum(2010,1,1);

dayStamp = dayFirst:(dayFirst + nDays - 1);
dayVec = datevec(dayStamp);

year = dayVec(:,1);

uniqueYear = unique(year);

K = length(uniqueYear);

a = nan(1,K);
b = nan(1,K);

for k = 1:K
   % use logical indexing to pick out the year
   currentYear = year == uniqueYear(k);
   a(k) = mean2(data(currentYear,:));
   b(k) = std2(data(currentYear,:));
end
这种方法的优点是灵活。如果你有一个数据集不是从1月1日开始的,或者不是在12月31日结束的,你不需要计算索引。MATLAB只是为你做的。另一个优点是,如果您想随后调用类似的内容,那么您已经有了一个有序的年份列表

errorbar(uniqueYear,a,b)

为了选择年份,我认为利用MATLAB的日期函数是最安全的,因为它已经知道闰年的所有规则

data = rand(32872,100); % replace with your data matrix

[nDays,nData] = size(data);

% let MATLAB construct the vector of dates and worry about things like leap
% year.
dayFirst = datenum(2010,1,1);

dayStamp = dayFirst:(dayFirst + nDays - 1);
dayVec = datevec(dayStamp);

year = dayVec(:,1);

uniqueYear = unique(year);

K = length(uniqueYear);

a = nan(1,K);
b = nan(1,K);

for k = 1:K
   % use logical indexing to pick out the year
   currentYear = year == uniqueYear(k);
   a(k) = mean2(data(currentYear,:));
   b(k) = std2(data(currentYear,:));
end
这种方法的优点是灵活。如果你有一个数据集不是从1月1日开始的,或者不是在12月31日结束的,你不需要计算索引。MATLAB只是为你做的。另一个优点是,如果您想随后调用类似的内容,那么您已经有了一个有序的年份列表

errorbar(uniqueYear,a,b)


哪一年是第一年?此信息对于了解每年的天数是必要的。@DanielF。如果您这样问,第一年将是2010年。第一个值是2010年1月1日吗?@craigim是的,是2010年1月1日,最后一个数据将是2099年12月31日。哪一个是第一年?此信息对于了解每年的天数是必要的。@DanielF。如果您这样问,第一年将是2010年。第一个值是2010年1月1日吗?@craigim是的,是2010年1月1日,最后一个数据将是2099年12月31日。第一年将是2010年。如果我使用mean,它将只给出每列的平均值,但当我使用mean 2时,它给出了我想要的总共1000列的平均值。所以你想找到一个单个数字,它是
365x1000
数字的平均值/std吗?是的。如果我用2010年作为我的第一年,我需要对你提供的代码做任何修改吗?我已经更新了我的答案;请参见编辑。严重地说,
mean2
std2
用于图像处理,仅包含在图像处理工具箱中。如果您愿意,可以使用它们,但我建议您使用
mean(mean(yeardata))
。如果您只想了解所有内容的平均值,请使用
mean(yeardata(:)
)保存对
mean
的调用。第一年将是2010年。如果我使用mean,它将只给出每列的平均值,但当我使用mean 2时,它给出了我想要的总共1000列的平均值。所以你想找到一个单个数字,它是
365x1000
数字的平均值/std吗?是的。如果我用2010年作为我的第一年,我需要对你提供的代码做任何修改吗?我已经更新了我的答案;请参见编辑。严重地说,
mean2
std2
用于图像处理,仅包含在图像处理工具箱中。如果您愿意,可以使用它们,但我建议您使用
mean(mean(yeardata))
。如果您只想了解所有内容的平均值,请使用
mean(yeardata(:)
)保存对
mean
的调用。我得到的索引超过了矩阵维数错误,“a=mean2(降雨(I:I+365-1,:));供你参考,我用2010年作为我的第一年。我得到的指数超过了矩阵维数错误,“a=mean2(降雨量(I:I+365-1,:);供你们参考,我用2010年作为我的第一年。是否可以用这个代码计算每年的数据集总和?为了简单起见,第1-365行是第一年,第1-1000列是该年的数据集,我想要的是每列的总和(1:365),所以答案是1000列加1行。我试图操作上面的代码,但没有成功,出现了错误。若你们也能帮我,我将非常感激。是否有可能使用此代码计算每年的数据集总和?为了简单起见,第1-365行是第一年,第1-1000列是该年的数据集,我想要的是每列的总和(1:365),所以答案是1000列加1行。我试图操作上面的代码,但没有成功,出现了错误。如果你也能帮我,我将非常感激。