如何在循环中将特定索引从字符数组中拉出?

时间:2019-06-18 12:45:00

标签: arrays matlab indices

我有一个数组,其中包含多个日期,格式为yyyymmdd,存储为50x1的double。我正在尝试提取年,月和日,以便可以使用datenum为每个日期分配一个序列号。

为单个日期建立索引,使用str2num进行转换,然后为适当的索引建立索引并提取适当的值,但是当我尝试遍历日期列表时,它不起作用-仅返回数字2的变体。

dates = [20180910; 20180920; 20181012; 20181027; 20181103; 20181130; 20181225];

% version1
datesnums=num2str(dates); % dates is a list of dates stored as 
integers

for i=1:length(datesnums)
    pullyy=str2num(datesnums(1:4));
    pullmm=str2num(datesnums(5:6));
    pulldd=str2num(datesnums(7:8));
end

以及

%version2
datesnums=num2str(dates,'%d')

for i = 1:length(datesnums)
    dd=datenum(str2num(datesnums(i(1:4))),str2num(datesnums(i(5:6))), 
    str2num(datesnums(i(7:8))));
end

我正在尝试生成一个新数组,该数组只是输入日期的序列号。在所示的示例中,我仅获得单个整数值,我知道这是因为循环不正确,并且会出现错误,指出“索引超出了数组元素的数量(1)”。对于版本1。当我获得它成功遍历所有内容时,对于每个日期,输出只是“ 2222”,“ 22”,“ 22”,这是不正确的。我究竟做错了什么?我需要合并一个细胞阵列吗?

2 个答案:

答案 0 :(得分:1)

要循环获取所有的年,月和日:

datesnums=num2str(dates);

for i=1:size(datesnums, 1)
    pullyy(i) = str2num(datesnums(i,1:4));
    pullmm(i) = str2num(datesnums(i,5:6));
    pulldd(i) = str2num(datesnums(i,7:8));
end

实际上,您可以无循环进行此操作:

pullyy = str2num(datesnums(:,1:4));
pullmm = str2num(datesnums(:,5:6));
pulldd = str2num(datesnums(:,7:8));

说明

例如,如果dates向量是[6x1]数组:

dates =[...
    20190901
    20170124
    20191215
    20130609
    20141104
    20190328];

datesnums=num2str(dates);创建一个大小为[6x8]的字符矩阵,其中每一行对应于dates中的一个元素:

datesnums =

  6×8 char array

    '20190901'
    '20170124'
    '20191215'
    '20160609'
    '20191104'
    '20190328'

因此,在循环中,您需要引用每个日期的行索引和列索引以提取年,月和日。

答案 1 :(得分:1)

我能想到的最简单的解决方案是:

SN = datenum(num2str(dates),'yyyymmdd')

您只需指定日期格式为'yyyymmdd'