对每个日期使用Matlab单元格数组中的find

对每个日期使用Matlab单元格数组中的find,matlab,datetime,find,Matlab,Datetime,Find,我有以下单元阵列(实际上更宽更长): 我想为每个日期添加两列,当“ZeroAndOne”第一次为1时,一列为1;当“ZeroAndOne”最后一次为1时,每个日期的一列为1。 一般来说,你会怎么做?以下是“手工”解决方案: 如果将单元格矩阵转换为表格,如下所示: T = cell2table(C(2:end,:)); T.Properties.VariableNames = C(1,:); 然后,您可以使用和来实现所需的结果: G = findgroups(T.Datetime); res =

我有以下单元阵列(实际上更宽更长):

我想为每个日期添加两列,当“ZeroAndOne”第一次为1时,一列为1;当“ZeroAndOne”最后一次为1时,每个日期的一列为1。 一般来说,你会怎么做?以下是“手工”解决方案:


如果将单元格矩阵转换为表格,如下所示:

T = cell2table(C(2:end,:));
T.Properties.VariableNames = C(1,:);
然后,您可以使用和来实现所需的结果:

G = findgroups(T.Datetime);
res = cell2mat(splitapply(@(x){Process(x)},T.ZeroAndOne,G));
T.OneForFirstTime = res(:,1);
T.OneForLastTime = res(:,2);

function res = Process(x)
    res = zeros(numel(x),2);
    res(find(x,1,'first'),1) = 1;
    res(find(x,1,'last'),2) = 1;
end
该过程是通过基于日期将表拆分为组,然后在每个单独的组上应用指定的逻辑来完成的。结果是:

 Datetime      ZeroAndOne    OneForFirstTime    OneForLastTime
___________    __________    _______________    ______________

01-Jan-1999    1             1                  0             
01-Jan-1999    1             0                  1             
05-Jan-1999    0             0                  0             
05-Jan-1999    1             1                  1            
无论为每个日期分配多少条目,这都是有效的(我不知道每个唯一日期是否只允许两个条目,您的示例在这一点上可能有点误导):

输出:

 Datetime      ZeroAndOne    OneForFirstTime    OneForLastTime
___________    __________    _______________    ______________

01-Jan-1999    1             1                  0             
01-Jan-1999    1             0                  1             
05-Jan-1999    0             0                  0             
05-Jan-1999    1             1                  0             
05-Jan-1999    0             0                  0             
05-Jan-1999    1             0                  1             

你的意思是说随着时间的推移,
ZeroAndOne
?那么,零和一是如何确定的呢?嗨,托马索,谢谢!在这种情况下,使用单元数组与使用表相比,有什么(dis)优势吗?我总是觉得很困惑…事实上,我找不到任何缺点。表格与单元格矩阵非常相似,因为它们可以让您处理填充在一起的不同类型。不同之处在于,例如,调用列标题可以让您获得原始类型的列数据。除此之外,还有各种各样的内置函数可以帮助您使用它们。您使用单元格创建的只是一个表。。那么,为什么不使用一个真正的呢?我提供了将单元格转换为表的代码,假设您在以前的代码中一直使用矩阵,但也可以直接创建一个。
 Datetime      ZeroAndOne    OneForFirstTime    OneForLastTime
___________    __________    _______________    ______________

01-Jan-1999    1             1                  0             
01-Jan-1999    1             0                  1             
05-Jan-1999    0             0                  0             
05-Jan-1999    1             1                  1            
% Example...
C = cell(7,2);
C{1,1} = 'Datetime';
C(2,1) = num2cell(datetime('01.01.1999','InputFormat','dd.MM.yyyy'));
C(3,1) = num2cell(datetime('01.01.1999','InputFormat','dd.MM.yyyy'));
C(4,1) = num2cell(datetime('05.01.1999','InputFormat','dd.MM.yyyy'));
C(5,1) = num2cell(datetime('05.01.1999','InputFormat','dd.MM.yyyy'));
C(6,1) = num2cell(datetime('05.01.1999','InputFormat','dd.MM.yyyy'));
C(7,1) = num2cell(datetime('05.01.1999','InputFormat','dd.MM.yyyy'));
C{1,2} = 'ZeroAndOne';
C{2,2} = 1;
C{3,2} = 1;
C{4,2} = 0;
C{5,2} = 1;
C{6,2} = 0;
C{7,2} = 1;

% My code for converting the cell into a table...
% My code for calculating the two additional rows...
 Datetime      ZeroAndOne    OneForFirstTime    OneForLastTime
___________    __________    _______________    ______________

01-Jan-1999    1             1                  0             
01-Jan-1999    1             0                  1             
05-Jan-1999    0             0                  0             
05-Jan-1999    1             1                  0             
05-Jan-1999    0             0                  0             
05-Jan-1999    1             0                  1