4

我有一个二维单元格,其中每个元素都是 a) 空或 b) 一个不同长度的向量,其值从 0 到 2 不等。我想获得出现某个值甚至更好的单元格元素的索引,每次出现某个特定值的“完整”索引。

我目前正在研究基于代理的疾病传播模型,这样做是为了找到受感染代理的位置。

提前致谢。

4

1 回答 1

5

这是我的做法:

% some example data
A = { [],     [], [3 4 5]
      [4 8 ], [], [0 2 3 0 1] };

p = 4; % value of interest

% Finding the indices:
% -------------------------

% use cellfun to find indices
I = cellfun(@(x) find(x==p), A, 'UniformOutput', false);

% check again for empties
% (just for consistency; you may skip this step)
I(cellfun('isempty', I)) = {[]};

调用这个方法1。

循环也是可能的:

I = cell(size(A));
for ii = 1:numel(I)
    I{ii} = find(A{ii} == p);
end
I(cellfun('isempty',I)) = {[]};

调用此方法2。

比较两种方法的速度,如下所示:

tic; for ii = 1:1e3, [method1], end; toc
tic; for ii = 1:1e3, [method2], end; toc

Elapsed time is 0.483969 seconds.  % method1
Elapsed time is 0.047126 seconds.  % method2

在带有 Intel Core i3-2310M@2.10GHz w/Ubuntu 11.10/2.6.38-13 的 Matlab R2010b/32bit 上。这主要是由于循环上的 JIT(以及cellfun似乎实现了多么可怕和匿名的函数,mumblemumble..)

无论如何,简而言之,使用循环:它的可读性更好,并且比矢量化解决方案快一个数量级。

于 2012-11-23T09:27:36.100 回答