【发布时间】:2012-11-29 15:46:51
【问题描述】:
给定一个矩阵A,我需要找到对应于值 1 和 2 的索引。我可以按如下顺序执行此操作:
>> 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
(或其他一些填充)
我怎样才能得到这个?
【问题讨论】:
-
您的数据格式有多灵活?如果单元格数组没问题,您可以尝试 arrayfun(@(x) find(B==x), [1 2], 'UniformOutput', false)
-
@mars 谢谢!我想我可以弄清楚如何从那里获取矩阵。
-
使用
find不会使 MATLAB 使用更多 CPU 内核 - here is a list 的内部函数可以受益于并行性。所以你不妨使用一个循环。 -
为什么
find(B==1 | B==2)不够用?甚至,如果您的应用程序允许,跳过find并只使用逻辑索引:B==1 | B==2。遗憾的是,我认为这不会并行完成……恐怕您必须为此编写自己的 MEX 文件。 -
另外,我假设您有一些更大的矩阵要比较?因为对于这么小的矩阵,启动两个线程的开销可能会使这个慢比单线程版本...
标签: matlab octave vectorization