假设我们有一个带有1000个值的矢量A A = [1000个值] 矩阵B是MxN:B = M×N
如何只选择A中出现的B中的那些值,并创建一个M行和相同数量的列的矩阵?
另外:这是一个关于使用互信息进行分类的问题。 'A'包含互信息,'B'包含测试数据集
编辑:A中的值来自另一个数据集的互信息算法,该数据集的大小为500x 1001.其中500是样本数,1000是特征向量大小。第一列是每个样本的类。 矩阵B仅包含具有特征向量且没有类的测试样本。
答案 0 :(得分:2)
如何只选择B中出现在A ...
中的那些值
您可以使用ismember
功能。
...并制作一个M行和相同数量的列的矩阵?
你确定B中的每一行都有与A中相同数量的元素吗?如果没有,这将无效。
答案 1 :(得分: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
是要搜索的目标值,沿第三维连接。bsxfun
依次从a
中减去每个值,并将结果的大小与某个小的阈值进行比较(例如eps
)。idx
的矩阵b
,该矩阵用作索引矩阵,以选择A
中显示的值。