在Matlab中,如何按日历年过滤结构并将感兴趣的元素插入到新的嵌套结构中?

时间:2013-06-26 01:53:42

标签: matlab sorting nested structure

在MATLAB中,我试图按日历年' m '过滤掉 nxtPdOut 结构( nxtPdOut(nn).datePdLow )并将每个 nxtPdOut(nn)元素插入到新结构 yoyComp(m)中。希望这不会太混乱,但我会尝试进一步解释。

以下代码将构建 nxtPdOut 结构(注意:此结构不是静态的,并且会随着未知的其他年份而改变):

nxtPdOut(1).datePdLow = 734505;
nxtPdOut(1).a = 111;
nxtPdOut(1).b = 222;
nxtPdOut(2).datePdLow = 734510;
nxtPdOut(2).a = 333;
nxtPdOut(2).b = 444;
nxtPdOut(3).datePdLow = 734868;
nxtPdOut(3).a = 888;
nxtPdOut(3).b = 887;

nxtPdOut(4).datePdLow = 734869;
nxtPdOut(4).a = 555;
nxtPdOut(4).b = 666;
nxtPdOut(5).datePdLow = 734872;
nxtPdOut(5).a = 777;
nxtPdOut(5).b = 888;
nxtPdOut(6).datePdLow = 734880;
nxtPdOut(6).a = 999;
nxtPdOut(6).b = 1010;

nxtPdOut(7).datePdLow = 735235;
nxtPdOut(7).a = 999;
nxtPdOut(7).b = 1010;
nxtPdOut(8).datePdLow = 735300;
nxtPdOut(8).a = 999;
nxtPdOut(8).b = 1010;

以下代码将确定要排序的 m 年(注意: m 年不会保持不变,并且将始终根据numYrs而变化):

numYrs = 2;
tDay = datevec(date);
for m=1:1:numYrs+1
    if m == 1
        yrs(:,:,m) = [tDay(1,1) tDay(1,2)-tDay(1,2)+1 tDay(1,3)-...
            tDay(1,3)+1 0 0 0];
    else
        yrs(:,:,m) =  [yrs(1,1,1)-m+1 1 1 0 0 0];
    end
end
jj = size(yrs(1,1,:));
for j=1:1:jj(3)
    yrsStr(1,j) = datenum(yrs(:,:,j));
end
yrsStr = fliplr(yrsStr); %ascending serial numbers

% Output for yrsStr: 
% yrsStr = [734504      734869      735235]
% FYI:  (datestr(yrsStr(1)) == 01-Jan-2011; 
%    datestr(yrsStr(2)) == 01-Jan-2012; 
%    datestr(yrsStr(1)) == 01-Jan-2013

我尝试了以下代码的不同组合,但是卡住了,不知道如何完成它。

nn = 1;
for n = 1:length(yrsStr)-1
    yoyComp(n).signals = nxtPdOut(nn).(nxtPdOut.datePdLow >= yrsStr(n) &...
        nxtPdOut(nn).datePdLow < yrsStr(n+1));
end

    while nn <= numel(nxtPdOut)
        if nxtPdOut(nn)
            yoyComp(n).signals = nxtPdOut

我尝试按日历年过滤 nxtPdOut ,并将结果放入新结构 yoyComp 。例如,734504&lt; = elements&lt; 734869成yoyComp(1); 734869&lt; = elements&lt; 735235进入yoyComp(2);最后,将元素&gt; = 735235转换为yoyComp(3)。请参阅以下内容以获得所需的输出:

yoyComp(1).out(1).datePdLow = 734505;
yoyComp(1).out(1).a = 111;
yoyComp(1).out(1).b = 222;
yoyComp(1).out(2).datePdLow = 734510;
yoyComp(1).out(2).a = 333;
yoyComp(1).out(2).b = 444;
yoyComp(1).out(3).datePdLow = 734868;
yoyComp(1).out(3).a = 888;
yoyComp(1).out(3).b = 887;

yoyComp(2).out(1).datePdLow = 734869;
yoyComp(2).out(1).a = 555;
yoyComp(2).out(1).b = 666;
yoyComp(2).out(2).datePdLow = 734872;
yoyComp(2).out(2).a = 777;
yoyComp(2).out(2).b = 888;
yoyComp(2).out(3).datePdLow = 734880;
yoyComp(2).out(3).a = 999;
yoyComp(2).out(3).b = 1010;

yoyComp(3).out(1).datePdLow = 735235;
yoyComp(3).out(1).a = 999;
yoyComp(3).out(1).b = 1010;
yoyComp(3).out(2).datePdLow = 735300;
yoyComp(3).out(2).a = 999;
yoyComp(3).out(2).b = 1010;

我很感激任何想法/建议继续下去。我知道如何从矩阵中过滤/提取,但我不知道如何通过结构来完成。请指教。谢谢。

1 个答案:

答案 0 :(得分:1)

您应该向inf添加最终yrsStr个字词,然后您可以使用此答案底部的修改代码来创建yoyComp结构。我所做的主要改变是使用逻辑索引,并通过用方括号括起表达式来捕获结​​构字段的输出(参见[nxtPdOut.datePdLow])。

这是我的意思的基本演示

对于结构

a(1).b = 5
a(2).b = 6
a(3).b = 7

您可以通过以下方式与其进行互动:

>> a.b

ans =

     5


ans =

     6


ans =

     7

或者将结果捕捉到矢量中:

>> [a.b]

ans =

     5     6     7

具体来说,对于您的代码,以下内容给出了您在问题中描述的结果:

yrsStr = [yrsStr, inf];

nn = 1;
for n = 1:length(yrsStr)-1
    yoyComp(n).signals = nxtPdOut([nxtPdOut.datePdLow] >= yrsStr(n) &...
        [nxtPdOut.datePdLow] < yrsStr(n+1));
end

请注意,我已删除我已删除

while nn <= numel(nxtPdOut)
    if nxtPdOut(nn)
        yoyComp(n).signals = nxtPdOut

你的代码部分,因为我不确定它在做什么。