仅选择矩阵向量中给出的值

时间:2013-05-23 11:26:54

标签: matlab machine-learning

假设我们有一个带有1000个值的矢量A A = [1000个值] 矩阵B是MxN:B = M×N

如何只选择A中出现的B中的那些值,并创建一个M行和相同数量的列的矩阵?

另外:这是一个关于使用互信息进行分类的问题。 'A'包含互信息,'B'包含测试数据集

编辑:A中的值来自另一个数据集的互信息算法,该数据集的大小为500x 1001.其中500是样本数,1000是特征向量大小。第一列是每个样本的类。 矩阵B仅包含具有特征向量且没有类的测试样本。

2 个答案:

答案 0 :(得分:2)

  

如何只选择B中出现在A ...

中的那些值

您可以使用ismember功能。

  

...并制作一个M行和相同数量的列的矩阵?

你确定B中的每一行都有与A中相同数量的元素吗?如果没有,这将无效。

答案 1 :(得分:2)

使用ismember查找BA的哪些成员:

ismember(B, A)

结果是与B具有相同尺寸的逻辑蒙版,然后您可以根据需要进行操作。要保留仅包含B中显示的元素的A行,请执行以下操作:

Bnew = B(all(ismember(B, A), 2), :)

处理浮点数

如果您的数据包含浮点数,则ismember方法可能会失败,因为浮点比较不准确(如Amro所指出的那样)。所以,这是另一种方法(类似于another answer of mine),这对浮点数是健壮的:

x = reshape(b, 1, 1, []);
idx = reshape(any(abs(bsxfun(@minus, x, a)) < eps, 2), size(b));
Bnew = B(idx);

基本上这是一个单行,但为了清楚起见,我将它分成两个命令:

  • x是要搜索的目标值,沿第三维连接。
  • bsxfun依次从a中减去每个值,并将结果的大小与某个小的阈值进行比较(例如eps)。
  • 将生成的逻辑向量重新转换为维度为idx的矩阵b,该矩阵用作索引矩阵,以选择A中显示的值。