使用Matlab,我如何按行将行分组到结构中?

时间:2013-06-14 22:53:27

标签: matlab vector matrix structure

使用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).

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

1 个答案:

答案 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
祝你好运!