【问题标题】:select only values given in a vector from a matrix [closed]从矩阵中仅选择向量中给定的值[关闭]
【发布时间】:2013-05-18 17:47:34
【问题描述】:

假设我们有一个包含 1000 个值的向量 A = [1000 个值] 和一个矩阵 B,它是 MxN : B = MxN

如何仅从 B 中选择出现在 A 中的那些值并制作一个 M 行和相等列数的矩阵?

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

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

【问题讨论】:

  • 如何保证出现在AB 中的值的数量可以被M 整除?你看,如果不是,你将无法用 M 行组成一个矩阵。
  • 不是。请查看编辑
  • 仍不清楚。您想保留B 中的哪些行?是那些所有值都出现在A 中的那些,还是至少一个值?

标签: matlab machine-learning


【解决方案1】:

我怎样才能只选择 B 中出现在 A 中的那些值...

您可以为此使用ismember 函数。

... 并制作一个 M 行且列数相等的矩阵?

您确定 B 中的每一行都会包含与 A 中相同数量的元素吗?如果没有,这将不起作用。

【讨论】:

  • 请参阅编辑。谢谢。
【解决方案2】:

使用ismember查找B的哪些成员出现在A中:

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 是要搜索的目标值,沿第三个维度连接。
  • bsxfuna 中依次减去每个值,并将结果的大小与某个小的阈值(例如eps)进行比较。
  • 生成的逻辑向量被重新整形为矩阵idx,其维度为b,用作索引矩阵以选择出现在A 中的值。

【讨论】:

  • 也许可以使用ismember(A,B,'rows') 的形式。请注意,您不应该以这种方式比较浮点数,请使用具有适当阈值的绝对差:abs(x-y)&lt;eps
  • @Amro A 只是一个值的集合,不是吗?不是 N 长度的行......在这种情况下,“行”在这里不好。关于浮点数的要点。
  • 也许你是对的,说实话问题不是很清楚
猜你喜欢
  • 1970-01-01
  • 2017-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-13
相关资源
最近更新 更多