2017-01-05 17 views
0

MATLABでは、配列のi番目の要素は(i)によってアクセスされ、セルのi番目の要素は{i}によってアクセスされます。ですから、私のコードはaがセルであるかどうかという点で異なったことをしなければなりません。一様な方法で配列/セル要素にアクセスする方法

良い方法がありますか?私たちはi番目の要素に「同じ」でアクセスできますか?方法。

答えて

3

あなたは同じように、a(i)に任意の配列のI番目の要素にアクセスすることができ、かつ動作が完全に均一である:あなたがaと背中同じクラスのオブジェクトを取得します。したがって、aが5x5 doubleの配列の場合、a(i)は1x1の倍数です。同様に、aがセル配列の場合、a(i)は1x1セルです。これまでのところ、論理的で一貫性があります。

ここでのセル内に表示する場合は、a{i}を使用しますが、これは基本的に異なる操作です。あなたの質問は、これらの2つの根本的に異なる操作が同じ構文を持っていれば、「より良い」ことを暗示しているようです。そうでないと、セル配列を任意の形状(1x1を含む)にスライスする能力が薄くなります。

しかし、いつでもカスタム関数を書くことができます。私はどこでも私と一緒に運ぶ多くのMatlabの回避策の中で、私は、関数の次のペアを持っている:

function a = ascell(a) 
if ~iscell(a), a = {a}; end 

とあなたのパス上uncell.m

function a = uncell(a) 
if iscell(a) & numel(a) == 1, a = a{1}; end 

b = uncell(a(i));はあなたに番目の要素を与えるだろうaであり、もしあれば、セルラッピングが剥がれている。

aが合法的に非細胞は、これは必ずしもないことは、細胞またはかもしれないという可能性にあなた(または別のメンテナ)を警告するためのコードでは見えuncellへの呼び出しを持つことは良いですみんなのコーディング戦略にも当てはまります。私のコードは、の意味を解釈し、非細胞が予想される細胞配列、または細胞が期待されていた非細胞を正しく扱うという点で、私のコードは必ずしもあなたと同じ規約に従わないでしょうなぜ共通の構文がないのかを説明する方法)。これは私の質問につながります:アプリケーションのデザインがaの場合、その性質上、形状やタイプが一致しない要素が含まれているような場合は、常にセルであり、セルではなく、常にアクセスするi番目の要素はa{i}となりますか?

+0

すべての要素が同じ場合、配列はセルよりも速く動作すると仮定します。だから私は配列とセルの両方を使用します。この仮定が間違っていると、私は常にセルを使用することが問題を解決することに同意します。 –

+1

これは実際に実行したい操作に依存します。ループを排除するために「ベクトル化」することで、数値配列ではるかに高速に実行できるように多くの演算*を実装することは可能ですが、今では数値用のコードとセル用のコードを持つことに戻ります。あなたのコードの2つの分岐の唯一の違いが 'a(i)'と 'a {i}'の場合、私はスピードアップの大部分を期待しません。また、私は、汎用MATLABループが(r2015a以来)はるかに高速化していると言われています。 – jez

関連する問題