【问题标题】:MATLAB-making intersect fasterMATLAB 使相交更快
【发布时间】:2015-08-25 09:18:03
【问题描述】:

假设有两个数组{A,B},大小为1xN

我想找出在相同索引上的案例数

满足条件A(ii)==1 & B(ii)==0

我试过了

casess= intersect( find(A==1),find(B==0 ))

但这很慢。

我相信这是因为intersect 检查每个成员是否是其他组的成员,但我仍在寻找最快的解决方案来解决我的小问题。

【问题讨论】:

  • 试试这个:casess = sum(A == 1 & B == 0); 不需要使用findintercept 进行简单的逻辑计算。
  • Ps 正在寻找更有趣的东西,然后是 for 循环
  • Naveh 如果我想获得这些案例的索引?
  • 那么你应该使用find:indices = find(A == 1 & B == 0);。顺便说一句,您甚至可能不需要索引,并且可以简单地使用逻辑索引,这取决于您想对它们做什么。例如,如果C 也具有相同的大小,vals = C(A == 1 & B == 0); 将为您提供C 的值,用于您将通过上述find 获得的索引。

标签: matlab optimization set-intersection


【解决方案1】:

这个条件成立的情况的数量可以用以下公式计算:

numCases = sum(A == 1 & B == 0);

表达式A == 1 & B == 0 给出了一个逻辑数组,例如,可用于查找条件为真的索引:

ind = find(A == 1 & B == 0);

或通过logical indexing直接访问相同大小的矩阵:

C = zeros(size(A));
C(A == 1 & B == 0) = 5;

【讨论】:

  • 很好的答案!。现在 numCases = sum(A == 1 & B == 0);是最慢的部分,有机会加快速度吗?即使是 mex 文件或 w/e 的成本?
  • 数组的大小是多少,您看到的运行时间是多少?你可以试试nnz 而不是sum。我不确定哪个会更快。
  • 通过快速检查,sumnnz 显示出相似的速度。然而,有趣的是:如果AB 都是非负数,那么sum(A + B - 1 == 0)sum(A == 1 & B == 0) 快十倍。不过,我不知道这是否与您的数据相关。
  • 轻微更正:B 必须严格为正才能使此方法与原始方法等效。关键是算术运算可以比逻辑运算更快,如果可以对数据进行一些限制,则可以利用这一点。
  • 很高兴有帮助:)
猜你喜欢
  • 2015-11-20
  • 1970-01-01
  • 2013-09-30
  • 1970-01-01
  • 2015-05-13
  • 2015-04-21
  • 2013-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多