1

使用 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 中。Struct(1).year 将只是 2010 年 1 月 1 日。对于所有日期 >= 734594(2011 年 1 月 1 日)和 < 734869(2012 年 1 月 1 日),每一行将存储在一个矩阵中,然后将存储在 struct (2).数据。Struct(2).year 将只是 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).

如果有人对我如何进行有任何建议,请告知。谢谢你。

4

1 回答 1

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

祝你好运!

于 2013-06-14T23:04:05.243 回答