【问题标题】:Find position of vector in matrix [duplicate]在矩阵中查找向量的位置[重复]
【发布时间】:2013-11-27 23:24:29
【问题描述】:

我有向量:

1 2 3

和矩阵:

4 1 2 3 5 5 
9 8 7 6 3 1
1 4 7 8 2 3

我正在尝试找到一种在矩阵中定位向量 [1 2 3] 的简单方法。

一个函数返回坐标(即:(1,2:4))或一个由 1 组成的矩阵,如果匹配,则返回 0,即:

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

到目前为止,我发现的唯一函数是“ismember”,但它只告诉我向量的各个分量是否出现在矩阵中。有什么建议吗?

【问题讨论】:

  • 我建议先搜索这个网站寻找类似的问题,这种问题被问到很多。

标签: matlab


【解决方案1】:

strfind 与矩阵的线性化版本一起使用,然后将线性索引转换为子索引。应注意删除跨越不同行的向量的匹配项。

mat = [1 2 3 1 2 3 1 2;
       3 0 1 2 3 5 4 4]; %// data
vec = [1 2 3]; %// data

ind = strfind(reshape(mat.',[],1).', vec);
[col row] = ind2sub(fliplr(size(mat)), ind);
keep = col<=size(mat,2)-length(vec)+1; %// remove result split across rows
row = row(keep);
col = col(keep);

此示例的结果:

>> row, col

row =

     1     1     2

col =

     1     4     3

表示向量出现3次:第1行,第1列;第 1 行,第 4 列;第 2 行,第 3 列。

结果可以用零一形式表示如下:

result = zeros(fliplr(size(mat)));
ind_ones = bsxfun(@plus, ind(keep).', 0:numel(vec)-1);
result(ind_ones) = 1;
result = result.';

给了

>> result

result =

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

【讨论】:

    【解决方案2】:

    获取矩阵中向量起始位置的一种方法是使用colfilt

    >> A = [1 2 3 1 2 3 1 2; ...
            3 0 1 2 3 5 4 4]; % matrix from Luis Mendo
    >> T = [1 2 3];
    >> colFun = @(x,t) all(x==repmat(t,1,size(x,2)),1);
    >> B = colfilt(A,size(T),'sliding',colFun,T(:))
    B =
         0     1     0     0     1     0     0     0
         0     0     0     1     0     0     0     0
    

    这给出了中心点的掩码,它转换为 (row,col) 坐标:

    >> [ii,jj]=find(B);
    >> locs = bsxfun(@minus,[ii jj],floor((size(T)-1)/2))
    locs =
         1     1
         2     3
         1     4
    

    【讨论】:

      猜你喜欢
      • 2015-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-02
      • 1970-01-01
      相关资源
      最近更新 更多