使用Matlab,我正在尝试构建一个结构,用于存储按年组织的矩阵X的分组行。向量yrsStr每年都需要进行分组。请参考矩阵X了解我要分组的值:
yrsStr = [734139 734504 734869 735235];
% 734139 is Jan 1 2010
% 734504 is Jan 1 2011
% 734869 is Jan 1 2012
% 735235 is Jan 1 2013
X = [734500 0 1 2 3;
734502 4 5 6 7;
734504 8 9 10 11; % Jan 1 2011
734505 12 13 14 15;
734868 16 17 18 19;
734869 20 21 22 23; % Jan 1 2012
734872 24 25 26 27;
735234 28 29 30 31;
735235 32 33 34 35; % Jan 1 2013
735236 36 37 38 39;
735250 40 41 42 43];
例如,如果日期小于2011年1月1日,则日期小于734504(2011年1月1日)的每一行将存储在矩阵中,然后存储在struct(1).data中。结构(1)。年将仅为2010年1月1日。对于所有日期> = 734594(2011年1月1日)和< 734869(2012年1月1日),每行将存储在矩阵中,然后存储在struct(2).data中。结构(2)。年将只是2011年1月1日。对于剩余的行将应用相同的。 yrsStr和X中的所有值都将不断变化(包括额外的甚至更少的年份),因此我尝试将代码编写为尽可能动态。我开始编写以下代码,但是我遇到了一堵墙而且真的不知道如何完成或继续。以下代码没有做太多,但它只反映了我的头脑风暴。
tDay = datevec(date)
numYrs = 3;
%Compute date vectors for previous years for comparison
for i=1:1:numYrs+1
if i == 1
yrs(:,:,i) = [tDay(1,1) tDay(1,2)-tDay(1,2)+1 tDay(1,3)-tDay(1,3)+1 0 0 0];
else
yrs(:,:,i) = [yrs(1,1,1)-i+1 1 1 0 0 0];
end
end
%Convert date from vector form to serial
jj = size(yrs(1,1,:));
for j=1:1:jj(3)
yrsStr(1,j) = datenum(yrs(:,:,j))
end
yrsStr = fliplr(yrsStr); %ascending serial numbers
% ###########I DO NOT KNOW WHAT TO DO BELOW HERE###############
kk = 1; %initialize yrsStr counting
m = 1; %initialize Y
for k=1:1:size(X,1)
if X(k,1) < yrsStr(kk)
Y(m) = X(k,:);
m = m + 1;
elseif X(k) < yrsStr(kk)
testStruct(kk).year = yrsStr(kk);
testStruct(kk).
如果有人对我如何进行有任何建议,请告知。谢谢。
答案 0 :(得分:1)
它不是无环路的,但我认为足够接近。
for ii = 1:length(yrsStr)-1
struct(ii).data = X(X(:,1) >= yrsStr(ii) & X(:,1) < yrsStr(ii+1),:);
end
struct(length(yrsStr)).data = X(X(:,1) >= yrsStr(length(yrsStr)),:);
我想不出更快的方式做最后一行。 (除了使用if
,或在yrsStr
末尾添加一个带有大数字的术语,并使循环更进一步。
最后一个是:
yrsStr(end+1) = inf;
for ii = 1:length(yrsStr)-1
struct(ii).data = X(X(:,1) >= yrsStr(ii) & X(:,1) < yrsStr(ii+1),:);
end
祝你好运!