繁体   English   中英

如何从 Octave 中的给定条件矩阵中提取向量

[英]How to extract vectors from a given condition matrix in Octave

我正在尝试提取具有两列的矩阵。 第一列是我要分组到向量中的数据,而第二列是有关该组的信息。

A =
1   1
2   1
7   2
9   2
7   3
10  3
13  3
1   4
5   4
17  4
1   5
6   5

我寻求的结果是

A1 =
1
2

A2 =
7 
9 

A3 =
7 
10
13

A4=
1 
5 
17

A5 =
1 
6 

作为说明,我使用了 eval function 但它没有给出我想要的结果

假设您实际上不需要单独命名的分隔变量,下面会将值放入元胞数组的单独单元格中,每个单元格可以是任意大小,然后可以使用单元格索引语法检索。 它使用逻辑索引,以便 for 循环的每次迭代都将 A 的第一列中的值分配给B中的该单元格,这些值在 A 的第二列中具有正确的数字。

num_cells = max (A(:,2));

B = cell (num_cells,1);

for idx = 1:max(A(:,2))
  B(idx) = A((A(:,2)==idx),1);
end

B =
{
  [1,1] =

     1
     2

  [2,1] =

     7
     9

  [3,1] =

      7
     10
     13

  [4,1] =

      1
      5
     17

  [5,1] =

     1
     6

}

单元格 arrays 的访问方式与普通数字 arrays 略有不同。数组索引(使用() )将返回另一个单元格,例如:

>> B(1)
ans =
{
  [1,1] =

     1
     2

}

要获取单元格的内容以便您可以像使用任何其他变量一样使用它们,请使用{}对它们进行索引。

>> B{1}
ans =

   1
   2

怎么运行的:

使用max(A(:,2))找出需要多少数组元素。 A(:,2)使用下标符号表示第 2 列中 A 的每个值。

创建一个空元胞数组B ,其元胞数量正确,以包含A的分离部分。 这不是绝对必要的,但是对于大量数据,如果你不断地添加到数组的末尾,事情会减慢很多。 预分配通常更好。

对于 for 循环的每次迭代,它确定A的第 2 列中的哪些元素具有与idx的值匹配的值。 这将返回一个逻辑数组。 例如,第三次通过 for 循环, idx = 3 ,并且:

>> A_index3 = A(:,2)==3
A_index3 =

  0
  0
  0
  0
  1
  1
  1
  0
  0
  0
  0
  0

这是一个 true/false 的逻辑数组,指示哪些元素等于 3。索引时允许混合使用逻辑和下标。 所以使用它我们可以从第一列中检索那些值:

 A(A_index3, 1)
ans =

    7
   10
   13

如果我们在没有A_index3中间占位符的情况下在一行中执行它,我们会得到相同的结果:

>> A(A(:,2)==3, 1)
ans =

    7
   10
   13

将它放在一个 for 循环中,其中 3 被循环变量idx替换,我们将答案分配给B中的idx位置,我们将所有值分成不同的单元格。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM