在矩阵中找到矢量的位置

时间:2013-11-27 23:24:30

标签: matlab

我有矢量:

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))或1s的矩阵,其中匹配为0,其中没有,即:

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

到目前为止,我发现的唯一功能是'ismember',但它只告诉我矢量的各个组成部分是否出现在矩阵中。建议?

2 个答案:

答案 0 :(得分:3)

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

意味着向量出现三次:第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

答案 1 :(得分:0)

在矩阵中获取向量起始位置的一种方法是使用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