matlab取矩阵满足条件,[MATLAB]矩阵中寻找满足条件的元素
参见张志涌精通matlab
A=randn(3,4)
A =
-0.5883
0.1139
-0.0956
-1.3362
2.1832
1.0668
-0.8323
0.7143
-0.1364
0.0593
0.2944
1.6236
以逻辑数组表达满足条件的元素:
L=(A>0)
L =
0
1
0
0
1
1
0
1
0
1
1
1
%寻找符合条件元素位置(返回为一列,并以单下标形式表示位置,故转置为一行)
s=(find(L))'或者
s=(find(A>0))'
s =
2
4
5
6
9
11 12
可以对满足条件的元素集体赋值
A(s)=0
A =
-0.5883
0
-0.0956
-1.3362
0
0
-0.8323
0
-0.1364
0
0
0
如果要以双下标形式返回符合条件的元素位置:
[ii,jj]=find(A==0);
disp(ii'),disp(jj')
2
1
2
3
3
2
3
1
2
2
2
3
4
4
最后,与arrayfun综合运用的一个例子,问题见于simwe forum,想了下可以采用下面的两种方式来完成:
请问如何查找矩阵中相同向量的位置?
比如矩阵A=【1,2,3,1;
2,3,4,2;
3,3,8,3】
向量为b =【1;2;3】
如何能不用循环找出b在A矩阵列中的位置,loc=【1
4】呢?方法一:A=[1,2,3,1;2,3,4,2;3,3,8,3];B=[1;2;3];C=find((ismember(A',B','rows'))');方法二:A=[1,2,3,1;2,3,4,2;3,3,8,3]B=[1;2;3];[M,N]=size(A);N=1:N;P=find(arrayfun(@(n)
isequal(A(:,n),B),N));
版上回复的其它方法:
方法1:find(all(bsxfun(@eq,A,B)))方法2:find(arrayfun(@(n)
all(A(:,n)==B),1:4))方法3: find(all(~bsxfun(@minus,A,B)))方法4:
find(arrayfun(@(n) isequal(A(:,n),B)
,1:4))方法5:find(B'*A==sum(B.^2))
bsxfun和arrayfun函数非常有用,建议楼主参考帮助文档了解其用法。方法5是用了点数学方法,有时候我们多分析下问题会得到意想不到的结果。
也可以不那么复杂,我只会些简单的函数命令(其实和你的方法3一个思路)
%% 矩阵中寻找向量
clc
clear all
A=[1 2 3;1 2 3;2 3 4;3 4 5]'
B=repmat([1:3]',1,4)
D=find(~all(B-A,1))
%B = all(A, dim) tests along the dimension of A specified by
scalar dim.
%dim=1:每一列都为非0,该列取1,否则取0,缺省;dim=2:行;dim=3:页,以此类推
