MATLAB:如何创建具有多个值的单元格数组,这些值对应于同一引用



我知道我的问题很具体,但仍然希望在这里找到答案,并希望它能在未来对更多人有所帮助。

我有不同的参考间隔,表示时间段,以及与每个时间段相关的不同值。例如:

starts = [17;249;17]; % starting points for the time periods
ends = [25;257;25]; % endingpoints for the time periods
values = [1; 2; 3]; % values to assign in correspondence of each interval

如果您注意到,第一个周期和第三个周期是相同的(相同的起始和结束参考值,17-25),因此值1和3可以与相同的周期相关联。

因此,我想获得两个数组,一个列出每个周期的时间步长,另一个列出与每个周期相关的值。我只能重复每个周期的时间步,做:

time_cell = cell (length(starts),1);
values_cell = cell (length(starts),1);
values_repeated = cell (1,length(starts));
for i= 1:length(starts)
        time_cell{i,1}= (starts(i,1):1:ends(i,1))';
        values_cell{i,1}= values(i);
        values_repeated{:,i} = repmat(values_cell(i,1),length(time_cell {i,1}),1);
end
all_times_numeric = cell2mat(time_cell(:,1));
all_values = cat(1,values_repeated{:,:})

这使我可以获得:

  all_values = 
   [1]
   [1]
   [1]
   [1]
   [1]
   [1]
   [1]
   [1]
   [1]
   [2]
   [2]
   [2]
   [2]
   [2]
   [2]
   [2]
   [2]
   [2]
   [3]
   [3]
   [3]
   [3]
   [3]
   [3]
   [3]
   [3]
   [3]

我可以使用函数unique来消除all_times_numeric中的重复,但我很难找到一种方法来合并中相同周期对应的值

all_values = 
    [1 3]
    [1 3]
    [1 3]
    [1 3]
    [1 3]
    [1 3]
    [1 3]
    [1 3]
    [1 3]
    [2]
    [2]
    [2]
    [2]
    [2]
    [2]
    [2]
    [2]
    [2]

all_values = 
    [1] [3]
    [1] [3]
    [1] [3]
    [1] [3]
    [1] [3]
    [1] [3]
    [1] [3]
    [1] [3]
    [1] [3]
    [2] []
    [2] []
    [2] []
    [2] []
    [2] [] 
    [2] []
    [2] []
    [2] []
    [2] []

是否有一种方法可以使用示例中实现的for循环获得这些数组中的任何一个,并在任何情况下扩展结果(任何开始/结束周期、与相同周期关联的更多值等)?非常感谢!

这里有一个选项:

starts = [17;249;17]; % starting points for the time periods
ends = [25;257;25]; % ending points for the time periods
values = [1; 2; 3]; % values to assign in correspondence of each interval
all_values = zeros(max(ends),max(values));
for k = 1:length(starts)
    all_values(starts(k):ends(k),values(k)) = values(k);
end
all_values = all_values(sum(all_values,2)>0,:);
all_values = arrayfun(@(r) nonzeros(all_values(r,:)).',...
    1:length(all_values),'UniformOutput',false).'

直到最后一行之前,add_values是一个矩阵大小max(ends)max(values),看起来像这样:

all_values =
     1     0     3
     1     0     3
     1     0     3
     .
     .
     .
     0     2     0
     0     2     0

所以对于每个时间步长,我们都有一行,在不同的列中有匹配的值。现在我们想去掉所有的零,并且只保留每行中的非零数字。因此,我们定义了新的匿名函数:

@(r) nonzeros(all_values(r,:)).'

得到一行r并返回all_values(r,:)中所有不同于零的值。nonzeros的输出是一列,因此为了将结果保持为一行,我们添加了.'(转置)。现在我们想将其应用于所有行,所以我们使用arrayfun:

arrayfun(function_handle,1:length(all_values)).'

这将function_handle中的函数,也就是我们刚刚定义的函数,应用于1:length(all_values)中的所有元素,这些元素只是all_values中的所有行号。但是,由于函数的输出大小不同,我们需要关闭'UniformOutput'选项,因此每个元素的结果都存储在单元阵列中的不同单元中。arrayfun的输出是一行,因此为了获得作为列的结果,我们添加了.'(转置)。所以我们得到:

all_values = 
    [1x2 double]
    [1x2 double]
    [1x2 double]
    .
    .
    .
    [         2]
    [         2]

最新更新