[英]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.