【问题标题】:Counting number of conflicting signs between two vectors计算两个向量之间冲突符号的数量
【发布时间】:2015-02-19 22:13:42
【问题描述】:

我有两个向量(实际上是 1xN 矩阵),它们的数字介于 [-1, 1] 之间。我想找出两个对应元素的符号不相同的实例数(sign(A[k]) ~= sign(B[k]))。有没有比只遍历两个向量更有效的方法?

【问题讨论】:

  • sum(sign(A) ~= sign(B))?
  • 如果你觉得好玩:nnz(A.*B<0)
  • @LuisMendo - 再来一个。这是相当模糊的:A = (A + 1)/2; B = (B + 1) / 2; C = accumarray([A(:)+1 B(:)+1], 1); out = C(2) + C(3); 远没有你和 Divakar 的效率高,但只是另一种完全炸毁这个 cmets 流的方式。
  • @LuisMendo - 呵呵,我知道。基本上我正在做的是我在 AB 之间计算 [-1,1], [1,-1], [-1,-1][1,1] 的组合,然后总结 [-1,1][1,-1] 的出现。
  • @rayryeng 当你有一把大锤子时,一切看起来都像钉子!

标签: matlab matrix vector matrix-multiplication


【解决方案1】:

在 cmets 中发布的两种解决方案同样适用于非时间关键型计算:

sum(sign(A) ~= sign(B)) -- Divakar

如果你觉得好玩:nnz(A.*B<0) -- Luis Mendo

但不好玩的版本sum(sign(A) ~= sign(B)) 似乎更快,大概是因为它避免了A.*B 中涉及的乘法。我是这样比较它们的:

Reps = 1e7; 
n = 10;
tic;
for i=1:Reps
  A = rand(1,n)-.5;
  B = rand(1,n)-.5;
  differ = sum(sign(A) ~= sign(B));   % or nnz(A.*B<0);
end
toc;

对于符号总和版本,计算时间为18.95 秒;对于A.*B 版本,它是47.70seconds。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    • 2017-08-22
    • 2017-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多