通过索引单元格编号来复制数组

时间:2017-12-26 13:08:41

标签: matlab

我试图从“嵌套”数组中提取特定列,我需要的列是嵌套的,大约有一千列,其中我只需要在数组的另一部分中用索引标记的列。

我有一个包含数值的数组{1,15}(例如2,5,10,53)。这些值是我需要从另一个数组中提取的索引号。

indexnum = OutArray{1,15}(:);

将它们安排在一列而不是一行中,完全没有必要,但我似乎更容易进步。

然后我将数组包含我想要提取/复制到新数组的实际列。

OutArray{1,14}{i,1}

因此,通过上面的示例数字,我需要将第2,5,10和53列复制到另一个数组。

我目前的一个尝试看起来像这样:

NewArray = []; %create new array
indexnum = OutArray{1,15}(:); %copy right index values to column
for i = indexnum{:} %use numeric value of every cell
NewArray = [NewArray, OutArray{1,14}{1,i}] %copy corresponding columns to NewArray
end

我也试过使用cell2mat(indexnum(1,:)),但这也没有帮助。

要明确数组的结构:

  • OutArray {1,15}包含每列有1个值的单元格,这是其他数组的索引号
  • OutArray {1,14}包含嵌套单元格,每列1个单元格
  • OutArray {1,14} {1,x}包含每列约30个值的列,其中我想复制具有正确索引的列

对于我需要复制所有列的另一个数组,这段代码工作正常:

new1 = [];
for i = 1:length(OutArray{1,4})
new1 = [new1, OutArray{1,4}{i,1}]
end

1 个答案:

答案 0 :(得分:0)

有点难以理解,因为细胞中有如此多的细胞,但你的截图非常有帮助。我将首先强调你的尝试中的错误和需要的变化:

NewArray = []; %create new array
indexnum = OutArray{1,15}(:); %copy right index values to column
for i = indexnum{:} %use numeric value of every cell
NewArray = [NewArray, OutArray{1,14}{1,i}] %copy corresponding columns to NewArray
end
  1. 执行OutArray{1,15}(:)OutArray{1,15}完全相同,因为您只选择完整的单元格。
  2. 您的for循环使用indexnum{:}作为迭代器,但{:}返回逗号分隔列表,对于提供完整向量的数组,它不像(:)那样工作。在这种情况下,当您将indexnum{:}分配给变量时,只能获得列表的第一个元素。举例说明:C = {1, 2, 3}; C{:}显示完整列表,但x = C{:}仅显示x = 1。要获取所有元素,您可以通过执行以下操作将它们分组到数组中:x = [C{:}]。 因此,在您的情况下,您只需要在for i = [indexnum{:}]中添加括号以使迭代器正常工作。
  3. 总而言之,您的代码将更改为:

    NewArray = []; %create new array
    indexnum = OutArray{1,15}; %copy right index values to column
    
    for i = [indexnum{:}]
        NewArray = [NewArray, OutArray{1,14}{1,i}}];
    end
    

    此外,您可以使用以下单行代码避免for循环和变量初始化:

    NewArray = [OutArray{1,14}{1,[OutArray{1,15}{1,:}]}];
    

    如您所见,它只需要数据的第1行OutArray{1,14}以及索引OutArray{1,15}的每个元素指定的列。括号需要两次,因为当使用带有多个索引的花括号索引单元格时,您总是得到一个列表并需要转换为数组,如上所述。