Advertisement

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的基础上提出了一种解决方案;经过思考后决定采用以下两种方案来解决:

请问如何查找矩阵中相同向量的位置?

比如矩阵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)都是非常有用的函数。它在处理数组运算方面表现得尤为出色。建议读者参考帮助文档以了解这些函数的具体操作方式。另外一种常用的方法是利用向量化操作来简化代码逻辑。这种方法不仅能够提高运行效率,在实际应用中也能避免冗余的循环结构。

也可以不那么复杂,我只会些简单的函数命令(其实和你的方法3一个思路)

victory.gif

%% 矩阵中寻找向量

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:页,以此类推

全部评论 (0)

还没有任何评论哟~