2016-05-11 3 views
1

私は、列行列と2つの列を持つセル配列を持っています。最初の列は1x2の倍数を持ち、2番目の列は1x1の倍数を持っています。例えばmatlabの別のセルにある行列の要素を検索する

columnMatrix = [1;5]; 
cellArray = {[1,8],[10];[8,1],[20];[4,6],[80];[3,5],[40];[14,16],[85];[5,10],[36]}; 

IはcellArray(:,1)columnMatrixの各要素を検索し、出力はこの

newCell = {[1],[10,20];[5],[40,36]}; 
ようにする必要があり、例えば cellArray(:,2)

内の対応する値を返したいです

このようにしてismember関数を使用しようとしました

[~,idx] = ismember(cell2mat(cellArray(:,1)),columnMatrix (: , 1)); 

これは、検索された要素を持つすべてのインデックスを返しますが、2つの別々の列にあり、対応する2番目の列エントリを取得するための他の論理操作は実行できません。

この操作は何らかの方法で達成できますか?誰かが助けてくれますか?

内の値を検索するために容易になるだろうので、おかげですべての

+0

何の指標には示してい、どのようにそれらが配置されていますか? – Crowley

+0

'idx = [1,0; 0,1; 0,0; ​​0,2; 0,0; ​​2,0]; ' –

答えて

1

まず、行列にcellArrayの最初の列に変換する。その後columnMatrix値を反復(arrayfunを使用して例えば、しかし、あなたはまた、forループを使用することができます)、 (any列に一致する)行を見つけて、cellArrayの2番目の列から対応する値を選択し、数値配列([cellArray{...,2}])に変換します。最後に、得られた細胞配列の最初の列としてcolumnMatrixを追加します。

columnMatrix = [1;5]; cellArray = {[1,8],[10];[8,1],[20];[4,6],[80];[3,5],[40];[14,16],[85];[5,10],[36]}; 

mat = cell2mat(cellArray(:,1)); 
values = arrayfun(@(x) [cellArray{any(mat==x,2),2}], columnMatrix, 'uni', false); 
result = [num2cell(columnMatrix), values]; 
+0

このarrayfun操作をありがとう。私はforループを使いましたが、別の方法で実行できるかどうかを知りたかったのです! –

+0

私はあなたの答えにフォローアップの質問があります気にしない場合。 'cellArray'の最初の列が等倍のサイズを持たず、' n> = 2'のところで '1xn'が二倍になるとどうなりますか?この場合、 'cell2mat'はカレント化エラーを返します!何か提案してください?ありがとう! –

+1

まだ論理インデックスを取得する必要があります。だから、 'any(mat == x、2)'の代わりに、例えば次のようにすることができます。 'cellfun(@(arr)any(arr == x)、cellArray(:、1))'を実行します。我々はもはや 'mat' varialbeは必要ないことに注意してください。 –

関連する問題