2016-05-31 11 views
1

私は次元1000x1(またはそれ以上)のセル配列VsCellを持っています。 VsCellの各項目は501x567の行列です。私は、セルに含まれるすべての行列の位置を占める要素を抽出したいと思います。matlabセルアレイのn番目の要素を選択する

VsCell {:}(1,1) - セル内の配列のすべての要素について VsCell {:}(2,1) - 配列のすべての最初の行2要素細胞内で

これらの選択の平均値または中央値を取って、VsCell配列の平均/中央値/等を表す単一の[501x567]マトリックス配列を埋め込むつもりである。 mean(VsCell {:}(1,1))である。

私はVsCell {:}(1,1)を試しましたが、 "Bad Cell Reference Operation"を返します。

また、ループ/ cellfunでほとんどまたはまったくこれを達成する方法はありますか? オンラインで見つかった例を使って、これを実際に達成することはできませんでした。

ありがとうございました。必要があれば、さらに明確にすることができてうれしいです。

答えて

3

私はあなたがしようとしていることは、ループなしで、またはcellfunというセルではできないと思います。セルは異種のデータ構造であるため、各要素が互換性のある形状を持つという保証はありません。あなたのセルの要素番号3は、別のセル、文字列、またはカスタムクラスのインスタンスであってもかまいません!私はちょうどあなたがしようとしている方法で細胞が索引付けされないことは驚くべきことではないと言っています。

ただし、でき詐欺cat enateことで、あなたの高次元配列への細胞、および作業:

VsMat = cat(3,VsCell{:}); % cell as comma separated list 
MatMeans = mean(VsMat,3); % mean along dimension 3, where they are concatenated 
MatMedians = median(VsMat,3); 
MatSums = sum(VsMat,3); 

、とにかく速くする必要があります配列の操作単一のトレードオフを除いてそう(遅い)catを呼び出すと、とにかく均質な配列を使うほうが良いでしょう。

+1

ありがとう@Andras!あなたは正しいです、私はスピードのために配列で作業することを選択しました。猫は仕事にあまりにも悪くはない、私のデータセットが本当に大きくなる可能性があることを考えれば、ネストされたfor-loopを使うよりも良い仕事をする。 – QP1

+0

catメソッドは配列のサイズ制限までうまく動作します。その後、メモリエラーが発生します。あなたはおそらく何か提案がありますか?私はこの時点でcellfunやforループの実装さえ気にしません。ありがとう – QP1

+0

@ QP1興味深いことに、私はあなたが 'cat()'の後に得た配列がセルそのものよりも少ないスペースを占めていると思います。 2つの可能な説明は、(1)あなたのデータが非常に大きいので、同時に1つのコピーしかメモリに収まらないため、元のセル+新しい配列が多すぎるか、(2) 'cat'にメモリオーバーヘッドがある。 2番目のケースでは、 'VsMat = 0(VsCell {1}、length(VsCell));}であらかじめ割り当てることができます。' 'VsMat(:、: 'cat'を使うのではなく、簡単な方法があるとは思えません。 –

関連する問題