作者diggershi (早立衫)
看板MATLAB
标题Re: [讨论] 想请教如何有效率地找出特定元素位置
时间Thu Oct 10 13:42:13 2013
※ 引述《banco (Acoustic)》之铭言:
: ※ 引述《smarter1004 (请拒绝看各新闻台)》之铭言:
: : 各位高手大家好
: : 假设 size(a) = [1 5]
: : 那如果我要找出a中等於0的元素位置我只要输入
: : a == 0
: : 那麽如果 size(a) = [10 5]
: : 我要找出a中等於[1 2 3 4 5]的row似乎只能用for回圈解决
: : 但它实在有够慢
: : 有没有类似第一个有效率方法的写法呢?
: : 谢谢各位
: 把它视为矩阵运算会比较快
: 我乱造一个 pp x 5 的矩阵M
: 每个row的数值为介於0~10的整数
: 从里面找有哪些row的内容为 [1 2 3 4 5]
: 基本想法是先来个矩阵减法
: 再来找哪些row的平方和为0
: pp=1000000;
: a = [1 2 3 4 5];
: M = floor(rand(pp,5)*10);
: tic;
: tmp=(M-ones(pp,1)*a)';
: find(sum( tmp.^2 )==0)
: toc
a=[1 2 3 4 5]
pp=1000000;
M = floor(rand(pp,5)*10);
s1=[1:pp];
for kk=1:5
s2=find(M(s1,kk)==a(kk));
s1=s1(s2);
end
s1为最後结果
手上没环境可以测试 不过应该逻辑没大问题吧
这样只要跑五个回圈,每次跑的运算量也会变少
再稍微小改一下,a的长度还可以用size得到,在带入for的数字。
限制就是每一个row 只能从头比对。 M如果是[10000,100],
要找後面的是否有符合的话 还需要在修改一下,应该也可以不用多一个回圈。
至於上面的完全不用回圈的话....
假设"=="可以矩阵元素一对一比较的话。我印象中可以这样做
超级暴力法
b=sum(M==a(ones(1,pp),:),2);
^^^ 这个不确定要用2或是1 主要是让比较
过後的每一个row加总
s1=find(b==5);
另也可以把上两行用成一行搞定
s1=find(sum(M==a(ones(1,pp),:),2)==5);
不过a的扩充矩阵会很吃记忆体,所以选着用吧
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.44.229.37