【问题标题】:Finding a vector within a vector在向量中查找向量
【发布时间】:2013-04-02 14:59:07
【问题描述】:

我有一个 (7,6) 逻辑数组,如下所示:

有效的Y2_A =

 0     0     0     0     0     0
 0     0     0     0     0     0
 0     0     0     1     0     0
 1     0     0     1     1     0
 1     1     1     0     0     1
 1     1     1     0     1     1
 0     1     1     1     1     1

我想创建一个 (1,6) 逻辑向量“contig”,它显示上述矩阵在每列中是否有 3 个连续的。例如,这样的结果将是:

contig =

[1, 1, 1, 0, 0 ,1];

我试过 strfind 但这有两个问题,第一个是它是一个列数组(转置要么根本没有帮助,要么需要大量额外的代码才能临时使用。第二个问题是因为它是一个逻辑数组,如果我把它改成一个字符串,值都会变成真或假,试图让它工作也没有结果。有没有一种方法可以搜索一个列向量来查找另一个列向量, 特定的列向量存在于其中的任何位置?我想在每一列中搜索 [1; 1; 1];

谢谢

【问题讨论】:

    标签: matlab


    【解决方案1】:

    怎么样

    t = imfilter( validY2_A, ones(3,1) );
    contig = any( t >= 3, 1 );
    

    或者(如@Dan 所建议):

    t = conv2( validY2_A, ones(3,1), 'same');
    contig = any( t >= 3, 1 );
    

    正如@GeorgeAprilis 所建议的,可能需要先将逻辑矩阵validY2_A 转换为双精度:

    validY2_A = double( validY2_A );
    

    【讨论】:

    • +1 但应将 imfilter 替换为 conv2 因为可能无法访问图像处理工具箱
    • 使用imfilter 的方法非常好。如果validY2_A 是逻辑矩阵,需要先将其转换为double 才能工作,否则t 也是逻辑矩阵。测试时,我需要将其更改为:t = imfilter( double(validY2_A), ones(3,1) );
    • 非常感谢,不过能否请您准确解释一下 conv2 或 imfilter 的作用?我正在查看矩阵 t,但我不明白发生了什么以及如何进行结果计算。
    • conv2 应用数字二维卷积。这是一个工作示例songho.ca/dsp/convolution/convolution2d_example.html
    • 这个方法可以用柱状方式吗?您的方法在一个步骤中创建了整个矩阵 t 和行 contig,但我想为循环中的每一列执行此操作。
    【解决方案2】:

    这里有一个应该很容易理解的方式:

    idx1=1:end-2
    idx2=2:end-1
    idx3=3:end
    

    基本上,这些索引会移动您的矩阵三倍。

    现在你只需应用它们:

    any(validY2_A(idx1,:) & validY2_A(idx2,:) & validY2_A(idx3,:))
    

    例如,使用循环和移位函数来概括这一点并不难。

    【讨论】:

      猜你喜欢
      • 2015-03-31
      • 2011-10-12
      • 1970-01-01
      • 1970-01-01
      • 2012-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多