【问题标题】:how to threshold/filter a vector? [duplicate]如何阈值/过滤向量? [复制]
【发布时间】:2013-04-21 14:34:44
【问题描述】:

我有一个包含数据列表(X 和 Y 坐标)的向量,我想将其与 100 个向量的数组(每个向量具有相似但不相同的 XY 坐标)进行比较以找到匹配项。

每个向量的数据大小范围(10 到 20 条线之间),这在匹配不同大小的矩阵时会导致问题。

所以为了匹配,我使用了匹配精确数据的匹配特征,这些数据不能用作不同大小的向量。

所以我做了 (使用 pdist 将绳索变成距离)

threshigh = (vector1/100) * 110;
threslow = (vector1/100) * 90;

if (Vector2 <= threshigh)&&(vector2 >= threslow)   
    disp its a match
else
    not a match
end

这太完美了!但是.. 我不能在向量上使用运算符,因为它们只适用于标量。

我该如何解决这个问题?

我也想到了,即使这可行,并且向量中的某些值落在此范围内,除非它们都匹配,否则它将不匹配?我如何获取大多数结果?

【问题讨论】:

  • 这略有不同,该链接很有帮助,但该问题没有回答我的第二个问题。

标签: matlab vector filter


【解决方案1】:

重复问题的链接应该可以解决您的第一个问题。至于你的第二个问题:

...即使这可行并且向量中的某些值落在此范围内,除非它们都匹配,否则它不会匹配?我如何获取大多数结果?

一旦你有了一个逻辑数组(在指定范围内的元素对应的位置为 1,在其他位置为 0),你可以根据自己的喜好对其进行操作。

在其当前形式中,if 语句仅在 所有 元素为 true(逻辑“1”)时分支。如果您知道被测试的表达式可能是一个向量(即 数组),您可以执行以下操作:

  • 使用any 命令检查数组中是否至少有一个元素是true:

    if any(...)
        %// Do something...
    end
    
  • 使用all命令检查是否所有元素都是true:

    if all(...)
        %// Do something...
    end
    

    (此处使用all 是多余的,但确实增强了可读性...)

  • 使用mode检查大部分'1':

    if mode(double(...))
        %// Do something...
    end
    

    mode 返回数组中出现频率最高的元素,因此如果它为 '1',if 语句将分支。

【讨论】:

  • 谢谢!那真的很治愈!但我做了这个'if idx > 0 counter = counter + 1;如果 idx == 0 则结束 counter2 = counter2 + 1; end' 但它不会计算 0 或 1 我可以看到它们显示 idx 但它不会计算它们?你知道这是为什么吗?再次感谢!
  • 哦,你忘了写 if 语句嵌套在 for 循环中:'forcounting = 1:length(idx)' 所以对于使用 if 语句的 idx 的长度,它应该系统地计算它们吗?
  • @Tom 不,因为在每次迭代中,您都在测试idx &gt; 0,正如我所说,如果idx 是一个数组,它就会变得有点荒谬。您应该测试idx(counting) &gt; 0,因为counting 是您的循环迭代变量。但是你为什么要做这一切?使用mode 来获取数组中出现频率最高的元素要简单得多...
  • mode 将只允许双或单数值,但因为 idx 是合乎逻辑的,它不会在模式下工作。我现在如何使用:idx2 = double(idx);将其更改为双倍然后使用模式。我相信这正在工作非常感谢您的宝贵时间,您的帮助最大!
  • @Tom 是的,很抱歉,请先使用double 将逻辑值转换为双精度值。我已经修改了答案。
猜你喜欢
  • 2012-05-10
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 2014-08-30
  • 2018-08-07
  • 1970-01-01
  • 2021-11-23
  • 2021-10-17
相关资源
最近更新 更多