Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays MATLAB:如何创建具有多个值的单元数组,这些值对应于同一个引用_Arrays_Matlab_Cell Array - Fatal编程技术网

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

Arrays MATLAB:如何创建具有多个值的单元数组,这些值对应于同一个引用,arrays,matlab,cell-array,Arrays,Matlab,Cell Array,我知道我的问题很具体,但我仍然希望在这里找到答案,它可以帮助更多的人在未来 我有不同的参考间隔,指示时间段,以及与每个时间段相关的不同值。例如: 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

我知道我的问题很具体,但我仍然希望在这里找到答案,它可以帮助更多的人在未来

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

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函数消除所有_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]

是否有一种方法可以使用示例中实现的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\u values
是一个矩阵大小
max(ends)
-by-
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,:)
中除零以外的所有值。
非零
的输出是一列,因此为了将结果保留为一行,我们添加了
(转置)。现在我们希望将此应用于所有行,因此我们使用:

这将在
1:length(all\u value)
中的所有元素上应用
function\u handle
中的函数,这是我们刚刚定义的函数,这些元素只是
所有值中的所有行号。但是,由于函数的输出大小不同,我们需要关闭
'UniformOutput'
选项,因此每个元素的结果存储在单元数组中的不同单元中。
arrayfun
的输出是一行,因此为了将结果作为一列,我们添加了
(转置)。因此,我们得到:

all_values = 

    [1x2 double]
    [1x2 double]
    [1x2 double]
    .
    .
    .
    [         2]
    [         2]

如此简单,如此有效。而且步骤比我的例子要少。非常感谢您提供此解决方案,它工作得非常完美!我还有最后一件事要问你:我不能准确地掌握你代码最后一行的内容。你能给我简单描述一下它的每一部分都有什么作用吗?@Giovanni.R88非常乐意!我对答案做了解释。非常感谢,我不熟悉匿名函数和arrayfun,但现在一切都清楚了!非常聪明的方法来获得想要的结果。再次感谢你,祝你一切顺利!
arrayfun(function_handle,1:length(all_values)).'
all_values = 

    [1x2 double]
    [1x2 double]
    [1x2 double]
    .
    .
    .
    [         2]
    [         2]