私は、すべての要素が a) 空であるか、b) 0 から 2 の範囲の値を持つさまざまな長さのベクトルである 2 次元セルを持っています。特定の値が発生するセル要素のインデックスを取得したいと思います。特定の値のすべての出現の「完全な」インデックス。
私は現在、病原体に基づく病気の拡散モデルに取り組んでおり、これは感染した病原体の位置を見つけるために行われます。
前もって感謝します。
これが私がそれを行う方法です:
% 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.
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
Matlab R2010b/32bit、Intel Core i3-2310M@2.10GHz、Ubuntu 11.10/2.6.38-13 で。これは主にループ上の JIT によるものです (そして、いかにひどくcellfun
無名関数が実装されているように見えるか、つぶやきます..)
とにかく、要するに、ループを使用してください。読みやすく、ベクトル化されたソリューションよりも桁違いに高速です。