c
私は同じサイズの配列のセル配列を持っていsize(c{n}) = [ m l ... ]
ますn
。1 回のスイープですべての配列要素のmean
値 (セル配列 index の平均)を取得するにはどうすればよいですか? andn
を使おうと思ったのですが、前者は別の次元を追加するのではなく、 に変わります。もちろん、手動でループするには永遠に時間がかかります...cell2mat
mean
l
l*n
6 に答える
すべての配列が同じサイズである場合は、セル配列ではなく行列に格納する方が理にかなっています。これにより、平均を取るなど、それら全体で操作を実行しやすくなります。関数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
より高いバージョンの 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
次のリンクで、セル配列内の平均値を見つける簡単な方法を見つけました: 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"
あなたは正しい軌道に乗っています。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
これはセルをループするだけで、シングルトンになるまで配列がダウンすることを意味します。それほど時間はかかりません。これは 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
他のコメントに感謝しますが、データを並べ替えたり、保存方法を変更したりするのが難しい場合があります。この問題を抱えている方は、ここに解決策があります。お楽しみください。
a=0;
MyCellAddFun=@(Input) a*eye(size(Input))+Input;
temp=arrayfun(@(ind) MyCellAddFun(CellData{ind}),1:length(CellData),'uniformoutput',false);
answer=temp{end}