在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;
我很感激任何想法/建议继续下去。我知道如何从矩阵中过滤/提取,但我不知道如何通过结构来完成。请指教。谢谢。
答案 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
你的代码部分,因为我不确定它在做什么。