我有两个矩阵S
和T
,其中n
列和行v
长度为n
。通过我的构建,我知道S
没有任何重复。我正在寻找的是快速查找行向量v
是否显示为S
行之一的方法。目前我正在使用测试
if min([sum(abs(S - repmat(f,size(S,1),1)),2);sum(abs(T - repmat(v,size(dS_new,1),1)),2)]) ~= 0 ...
。
当我第一次写它的时候,我每次都进行了一次for循环测试(我知道这会很慢,我只是确保整个过程先行)。然后我将其更改为通过上面的两个组件定义矩阵diff
然后求和,但这比上面稍慢。
我在网上找到的所有内容都说使用函数unique
。然而,这非常慢,因为它命令我的矩阵。我不需要这个,这大大浪费了时间(这使得这个过程非常缓慢)。这是我的代码中的瓶颈 - 占用了近90%的运行时间。如果有人对如何提高速度有任何建议,我会非常感激!
我想有一种相当直接的方式,但我不是那种经验丰富的Matlab(相当,不是很多)。我知道如何使用基本的东西,但不是一些更专业的功能。
谢谢!
为了澄清以下Sardar_Usama的评论,我希望这适用于具有任意数量的行和单个向量的矩阵。我忘了提到元素都在集{0,1,...,q-1}
中。我不知道是否有助于加快速度!
答案 0 :(得分:1)
你可能想要这个:
ismember(v,S,'rows')
并替换参数S
和v
以获取重复索引
ismember(S,v,'rows')
或者
如果v是S的成员,则进行测试:
any(all(bsxfun(@eq,S,v,2))
这将返回所有重复项的逻辑索引
all(bsxfun(@eq,S,v),2)