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需为标量
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