MATLAB中计算海量数据均值的有效方法
我有一个来自上一个模拟的输出,其中有32872行和1000列。行表示90年的每日数据,列表示90年的不同数据集。我想做的是分别计算每年的平均值和标准差。例如,我正在做的是: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
%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行。我试图操作上面的代码,但没有成功,出现了错误。如果你也能帮我,我将非常感激。