5

cellfunMATLABの関数について質問があります。

いつ/なぜそれを使用する必要があり、いつドロップしてもよいですか?

簡単な例: cell があり、内aのすべての値の平均を求めたいとしますa

a{1} = [1 2;3 4];
a{2} = [1 2 3;4 5 6; 7 8 9];

私のアプローチは次のようになります。

mean([a{1}(:); a{2}(:)])

これの適切なcellfunバージョンは何ですか?

私はこのようなことを試みました(明らかに機能していません):

mean_a = mean(cellfun(@mean, a,'UniformOutput',0))

ありがとう!

4

4 に答える 4

4

cellfunこれは、セル マトリックスをループして、
指定された関数を各セルで個別に実行するようなものです。
通常
、ループ内で同じことを明示的に行うよりも高速ですが、基本的な違いは、
書き込みと読み取りが簡単であることです。呼び出しが何をしているのかがすぐにわかり
ます。ただし、ループを自分で作成することもできます。

特定のケースでは、次のように使用できますcellfun

mean_a = mean(cellfun(@(x) mean(x(:)), a));

何千ものセルがあり、それらのそれぞれに何か
をしたい場合は、ループまたはcellfun
BTWを使用します。@(x)つまり、各セルの内容を
理解して、必要なものが得られるxようにすることを意味し ます-全体の平均セルのマトリックス コンテンツ。mean(x(:))

于 2013-05-16T00:56:07.973 に答える
1

ループの代わりにプロット操作に cellfun を使用するのが大好きです。たとえば、複数のセンサー データ セットがあり、各セットに複数の列がある場合 (セットごとに複数のセンサーがあるため)、非常に便利です。

numOfSensors = 5;
numOfSets = 6;

%% sample data preparation
x = 1:100;
y = rand(length(x), numOfSets*numOfSensors);
yCell = mat2cell(y, 100, numOfSensors*ones(1,numOfSets)); % this is my sensor data
scaleCell = num2cell(fliplr(cumsum(1:numOfSets)));
yCell = cellfun(@(x, scale)x.*scale, yCell, scaleCell, 'unif', false);

%% plot preparation
nameCell = arrayfun(@(x)['sensor set ' num2str(x)], 1:numOfSets, 'unif', false);
colorCell = num2cell(lines(numOfSets), 2)';

%% plot
figure, hold all,
set(gca, 'ColorOrder', [0 0 0], 'LineStyleOrder', {'-','--','-*','-.',':'})
h = cellfun(@(y, name, c)plot(x, y, 'linewidth', 1.5, 'displayName', name, 'color', c), yCell, nameCell, colorCell, 'unif', false);
hh = cellfun(@(x)x(1), h, 'unif', false);
legend([hh{:}])

ループする代わりに。この例では、すべてのデータセット、各データセットを独自の色でプロットし、データセットごとの各センサーを別の線種でプロットします。凡例は、各データ セットに対してのみ表示されます (注: これは、hggroups を使用して行うこともできます)。

または、より単純な使用例-データのセル配列が再びあり、それを簡単に表示したい:

figure, hold all, cellfun(@plot,dataCell)

これで、1 行、コマンド ラインで非常に高速に実行できます。

もう 1 つの優れた使用例は、mean()、max()、min()、std() などを使用して高次元データの数値データを圧縮することですが、これについては既に言及しました。データのサイズが均一でない場合、これはさらに重要になります。

于 2016-07-06T10:12:38.857 に答える