我有矢量:
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',但它只告诉我矢量的各个组成部分是否出现在矩阵中。建议?
答案 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