在Matlab数组中快速复制测试

时间:2016-10-20 16:47:41

标签: matlab performance matrix

我有两个矩阵ST,其中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}中。我不知道是否有助于加快速度!

1 个答案:

答案 0 :(得分:1)

你可能想要这个:

ismember(v,S,'rows')

并替换参数Sv以获取重复索引

ismember(S,v,'rows')

或者

如果v是S的成员,则

进行测试:

  any(all(bsxfun(@eq,S,v,2))

这将返回所有重复项的逻辑索引

 all(bsxfun(@eq,S,v),2)