-5

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

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

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

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

4

2 回答 2

2

用于ismember查找B出现在 中的成员A

ismember(B, A)

结果是一个与 具有相同维度的逻辑掩码B,然后您可以根据需要对其进行操作。要保持其中的行B仅包含出现在 中的元素A,请执行以下操作:

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

处理浮点数

如果您的数据包含浮点数,则该ismember方法可能会失败,因为浮点比较不准确(如Amro所指出的)。所以,这是一种替代方法(类似于我的另一个答案),它对浮点数很健壮:

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
于 2013-05-23T11:45:53.443 回答
2

如何仅从 B 中选择出现在 A 中的那些值...

您可以使用该ismember功能。

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

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

于 2013-05-23T11:28:59.810 回答