matlab查找元素在矩阵中的位置

find

A为矩阵或向量, n为待查的某个数或向量.  A n不能同为向量
[x,y] = find(A == n)  %  x,y分别为n所在的行和列
index = find(A == n)   % index为返回的按列存储位置 [H,W] = size(A)  index = (y - 1) * H + x
% n为行/列向量时,要求其长度等于A的行/列长度.  除了==, 还支持> <等比较 

%% demo
A = reshape(1:6,2,3)
%% 1
n = 3;
index = find(A == n)
[x,y] = find(A == n)
index = find(A == 8)
%% 2
n = [1 2 3]; % [1 2 5] 测试此二例
[x,y] = find(A == n);
n = [1 2];
[x,y] = find(A == n); % error, 长度不等
n = [1;2];
[x,y] = find(A == n);

%% 3
[x,y] = find(A(1,:),n); % error, 不能同为向量  A为向量时,n需为标量

ismember

A为任意维度的矩阵, B为待查的元素,可以任意维度的矩阵.  ismember(B,A)
[~,id] = ismember(3,3)  % A B 同为标量  ~为逻辑值,1 或 0
[~,id] = ismember(1:6,3)  % 对比下个指令
[~,id] = ismember(3,1:6)  
% ismember最常见应用在于判断某向量或矩阵B是否为矩阵A的子集
A = reshape(1:18,6,3);
B = reshape(1:6,2,3);
[~,id] = ismember(B,A,'rows');  % 对比下个指令
[~,id] = ismember(B,A)  % 当指定参数'rows'时,将行向量看作整体进行判断,且要求A B的列数相等. 未指定参数'rows'时,则逐个元素判断.

问题在于如果B是A的真子集时,如何方便高效判断B是否为A的一部分, 笔者给出如下方案. 如果B为A的重复子部分,需对结果进行保存.欢迎大家批评指正:

A = reshape(1:30,6,5);
B = A(2:4,2:4);
[HA,WA] = size(A);
[HB,WB] = size(B);
temp = B(1,:);
cols = [];
for i = 1:WA - WB + 1
    if (ismember(temp,A(:,i:i+WB-1),'rows'))
        [~,rows] = ismember(B,A(:,i:i+WB-1),'rows');
        cols = i:i+WB-1;
        break  %  或者对结果进行保存, 再接着扫描
    else
        continue
    end
end
rows
cols

matlab查找元素在矩阵中的位置_第1张图片

你可能感兴趣的:(matlab,矩阵,matlab)