如何提取与另一个单元格数组的某一列相同编号的单元格数组中的单元格行?

时间:2019-05-01 14:32:24

标签: octave

我有一个大小为4x1的单元格数组,但是它可以根据数据输入而变化。

每个单元格都是一个10列的矩阵,并取决于大约10000至70000行的输入,全部包含数字。

另外,我还有另一个单元格(同样,几个单元格包含许多行,一个列),该数组保存大单元格数组的每个单元格的第6列的唯一值(第6列包含度量的pointnumbers点,则具有相同pointnumber的许多时间戳。

我现在想遍历第一个单元格数组的每个单元格,并将每个唯一pointnumber的所有不同时间戳分组为一个单元格,从而创建一个新的单元格数组。

如何提取与另一个单元格的某一列的编号相同的单元格中的单元格行?

我在下面尝试了一些for循环版本,但是总是会出现错误(没有匹配的尺寸等),或者它仅返回第一个单元格。

    for i = 1:N
      a = C1{i,1}(:,6) == inter_igp{i,1}(i,1);
      C1_new{i,1} = a;
    endfor

C1是大单元格数组,我要调查每个单元格到矩阵的第6列,并将inter_igp单元格数组中每个点的时间戳记分组为一个单元格,然后放入新单元格数组C1_new

提到的单元格数组具有以下大小(注意,行数随数据输入的变化而变化,列数保持不变。

    C1 = {{rand(10,10)} ; {rand(30,10)} ; {rand(20,10)}};

    inter_igp = {{rand(10,1)} ; {rand(15,1)}};

我现在想知道列C1的每个单元格中的哪些行与inter_igp的每个值匹配(现在当然不匹配随机矩阵,但这只是为了显示单元格数组的大小),然后将属于inter_igp的相同值的所有行放在C1_new的一个单独的单元格中。

1 个答案:

答案 0 :(得分:0)

您的代码存在一些问题。首先输入数据:

C1 = {{rand(10,10)} ; {rand(30,10)} ; {rand(20,10)}};

您在这里使用单元格数组创建一个单元格数组,每个内部单元格数组只有一个元素。因此,要访问存储的矩阵,您需要做

C1{ii}{1}

{1}完全多余。而是,按如下所示创建您的单元格数组:

C1 = {rand(10,10) ; rand(30,10) ; rand(20,10)};

或等效地:

C1 = [{rand(10,10)} ; {rand(30,10)} ; {rand(20,10)}];

在第一种情况下,我们制作了一个包含3个数组的单元格数组。在第二种情况下,我们制作了3个单元格数组,每个单元格包含1个数组,然后将它们串联成具有3个数组的单个单元格数组。

第二个输入数组也是如此。


第二个问题是等号。如果我们要比较浮点值(在示例数据中由rand返回),则极不可能找到任何两个相等的元素。如果是这样,请与公差进行比较。但是,由于真正的问题是时间戳,因此可以将其与相等性进行比较。

但是,用这种方法比较两个不同的数组将不起作用。 A==B比较所有A(ii)==B(ii)的每个元素对ii。这不是我们所追求的逻辑。我们正在寻找第一个数组中的所有元素,也正在第二个数组中。可以使用ismemberismember(A,B)来解决。


第三个问题是您要用i索引到inter_igp,但是iC1的索引,并且这两个数组的大小不同。我假设您想为C1中的每个数组找到一个与inter_igp中的每个元素匹配的数组。这将导致一个二维输出数组:C1_new{ii,jj}将是C1{ii}中具有与inter_igp{jj}匹配的时间戳的元素。


了解上述所有情况(并假设我正确理解了问题),正确的代码将是:

C1 = {randi(50,10,10) ; randi(50,30,10) ; randi(50,20,10)};
inter_igp = {randi(50,10,1) ; randi(50,15,1)};

C1_new = cell(numel(C1), numel(inter_igp));
for ii = 1:numel(C1)
   for jj = 1:numel(inter_igp)
      index = ismember(C1{ii}(:,6), inter_igp{jj});
      C1_new{ii,jj} = C1{ii}(index,:);
   end
end

请注意,我使用了randi,它输出整数。这使我可以进行相等比较。

还要注意,我正在预先分配C1_new,以避免在每次循环迭代时调整其大小。