2012-11-29 61 views
1

给定矩阵A,我需要找到相应的值是1和2。我能做到这一点依次指标如下:如何矢量化矩阵子集,使find()返回一个矩阵?

>> B 

B = 

    1  2  3 
    4  1  6 
    7  8  9 
    4  5  1 

>> find(B==1) 

ans = 

    1 
    6 
    12 

>> find(B==2) 

ans = 

    5 

但是,如果我在一个循环中做这样的操作,MATLAB会只使用我的处理器的一个核心。我如何进行矢量化,以便从find获得矩阵?我想这样的结果:

>> my_find(B, [1 2]) 

ans = 

    1 5 
    6 0 
    12 0 

(或其他填充)

我怎样才能获得呢?

+0

你如何灵活与您的数据格式?如果一个单元格阵列没问题,你可以尝试arrayfun(@(x)find(B == x),[1 2],'UniformOutput',false) – mars

+0

@mars谢谢!我想我可以弄清楚如何从那里获得矩阵。 – Andreas

+2

使用'find'不会让MATLAB使用更多的CPU核心 - [这里是一个列表](http://www.mathworks.se/support/solutions/en/data/1-4PG4AN/?solution=1-4PG4AN)可以从并行性中受益的内部函数。所以你不妨使用循环。 – angainor

回答

0

[I,J] = ind2sub(大小(B),找到(逻辑(总和(bsxfun(@eq,B(:),[1 2]),2))))

+0

有了这个,我不认为有可能辨别哪些匹配'1',哪些匹配'2'。 – Andreas

+0

当然是的;只是将它分成多行:Bprime = B(:); inds = find(logical(sum(bsxfun(@eq,Bprime,[1 2]),2))); Bprime(inds)将为您提供与inds中每个返回索引相匹配的值。 – wakjah

+0

然后它不是矢量化的...... – Andreas

5

只是不't use find

B==1 

ans = 

1  0  0 
0  1  0 
0  0  0 
0  0  1 

B==2 

ans = 

0  1  0 
0  0  0 
0  0  0 
0  0  0 

然后再将它们加在一起。

(B==1) + (B==2) 

ans = 

1  1  0 
0  1  0 
0  0  0 
0  0  1 

(B==1) | (B==2) 

ans = 

1  1  0 
0  1  0 
0  0  0 
0  0  1 
+1

+1,虽然我会推荐使用'&'而不是'+',以便数据类型保持逻辑。 – mythealias

+0

好的建议,+1 –

+0

实际上在这种情况下需要是逻辑或'|' –