9

c私は同じサイズの配列のセル配列を持っていsize(c{n}) = [ m l ... ]ますn。1 回のスイープですべての配列要素のmean値 (セル配列 index の平均)を取得するにはどうすればよいですか? andnを使おうと思ったのですが、前者は別の次元を追加するのではなく、 に変わります。もちろん、手動でループするには永遠に時間がかかります...cell2matmeanll*n

4

6 に答える 6

17

すべての配列が同じサイズである場合は、セル配列ではなく行列に格納する方が理にかなっています。これにより、平均を取るなど、それら全体で操作を実行しやすくなります。関数NDIMSおよびCATを使用して、データを行列に変換できます。

dim = ndims(c{1});          %# Get the number of dimensions for your arrays
M = cat(dim+1,c{:});        %# Convert to a (dim+1)-dimensional matrix
meanArray = mean(M,dim+1);  %# Get the mean across arrays
于 2011-03-04T18:22:22.923 に答える
5

より高いバージョンの matlab をお持ちの場合は、'cellfun' 関数で実行できます。これにより、サイズの異なる配列を持つセルを処理できます。

C = {1:10, [2; 4; 6], []};
Cmeans = cellfun(@mean, C)
Cmeans =
    5.5000    4.0000       NaN

参照: https://groups.google.com/forum/?fromgroups=#!topic/comp.soft-sys.matlab/S_hyHxy11f0

于 2012-09-10T19:38:25.127 に答える
2

次のリンクで、セル配列内の平均値を見つける簡単な方法を見つけました: http://www.gomatlab.de/cellfun-t25114.html

x細胞かもしれません。それで:

var_mean = cellfun(@mean, x, 'UniformOutput', false); %columnwise mean value


var_mean = cellfun(@(in) mean(in(:)), x); %% mean value of the total "subcell"
于 2013-11-06T09:22:30.543 に答える
2

あなたは正しい軌道に乗っています。CELL2MATを使用してセル配列を数値配列に変換し、次にRESHAPEを使用して 3 次元行列を作成します。次に、ディメンション引数を指定したMEAN関数を使用して平均を計算できます。

>> c = {[1 2 3; 4 5 6] [7 8 9; 12 13 14]}

c =

    【2×3ダブル】 【2×3ダブル】

>> mean(reshape(cell2mat(c), [2, 3, 2]), 3)

ans =

     4 5 6
     8 9 10
于 2011-03-04T18:22:59.967 に答える
1

これはセルをループするだけで、シングルトンになるまで配列がダウンすることを意味します。それほど時間はかかりません。これは 4000 万のフロートを意味し、1 秒かかります。

function n = big_mean
tic
c = cell(1000);

for ii = 1:length(c)
    c{ii} = rand(8,7,6,5,4,3,2);
end

n = all_cells(c);
toc
end

function n = all_cells(c)

n = zeros(length(c),1);
for ii = 1:length(c)
    n(ii) = cell_mean(c{ii});
end

n = mean(n);
end

function n = cell_mean(n)

while length(size(n))~=2
    n = mean(n);
end

end

Elapsed time is 1.042459 seconds.

ans =

    0.4999
于 2011-03-04T18:36:35.967 に答える
0

他のコメントに感謝しますが、データを並べ替えたり、保存方法を変更したりするのが難しい場合があります。この問題を抱えている方は、ここに解決策があります。お楽しみください。

a=0;
MyCellAddFun=@(Input) a*eye(size(Input))+Input;
temp=arrayfun(@(ind) MyCellAddFun(CellData{ind}),1:length(CellData),'uniformoutput',false);
answer=temp{end}
于 2014-02-20T02:29:20.733 に答える