2016-05-11 15 views
1

Ich habe eine Spaltenmatrix und ein Zellen-Array, das zwei Spalten hat. Die erste Spalte hat 1x2 verdoppelt und die zweite Spalte hat 1x1 verdoppelt.Suche Elemente der Matrix in einer anderen Zelle in Matlab

Zum Beispiel

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

Ich mag jedes Element columnMatrix in cellArray(:,1) suchen, und dann seinen entsprechenden Wert zurück in cellArray(:,2)

beispielsweise die Ausgabe so

newCell = {[1],[10,20];[5],[40,36]}; 
sein muss,

Ich versuchte mit der ismember Funktion auf diese Weise

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

Dies gibt alle Indizes zurück, die das gesuchte Element haben, aber sie sind in zwei separaten Spalten und ich kann keine andere logische Operation ausführen, um den entsprechenden zweiten Spalteneintrag zu erhalten.

Gibt es eine Möglichkeit, diese Operation zu erreichen? Könnte jemand bitte helfen?

Dank

+0

Welche Indizes zeigt es und wie sie angeordnet sind? – Crowley

+0

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

Antwort

1

Zunächst einmal konvertiert erste Spalte von cellArray zu einer Matrix so wäre es einfacher zu suchen Werte in. Dann columnMatrix Werten iterieren (zB arrayfun verwenden, aber man könnte auch für Schleife verwenden), Finde Zeilen, die übereinstimmen (any über Spalten) und wähle die entsprechenden Werte aus der zweiten Spalte von cellArray aus und konvertiere in ein numerisches Array(). Schließlich fügen Sie die columnMatrix als die erste Spalte der resultierenden Zellenfeld:

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

Danke für diese arrayfun-Operation. Ich habe die for-Schleife benutzt, wollte aber wissen, ob das auch anders geht! –

+0

Wenn es Ihnen nichts ausmacht, habe ich eine Follow-up-Frage zu Ihrer Antwort. Was ist, wenn die erste Spalte von 'cellArray' nicht die gleiche Größe hat, aber' 1xn' verdoppelt, wobei 'n> = 2' ist? In diesem Fall gibt 'cell2mat' einen Verkettungsfehler zurück! Irgendwelche Vorschläge bitte? Vielen Dank! –

+1

Sie müssen immer noch die logischen Indizes erhalten. Anstatt "any" (mat == x, 2) 'zu machen, können Sie z.B. mach 'cellfun (@ (arr) any (arr == x), cellArray (:, 1))'. Beachten Sie, dass wir keine 'mat'-Varialbe mehr benötigen. –

Verwandte Themen