2016-04-16 7 views
0

Ich habe dieses Array, das 12 Nummer P = [1 2 3 4 5 6 7 8 9 10 11 12] I will um jeweils 3 Elemente aus diesem Array in eine Zelle bei 2d Matrix in Matlab zu setzen, um 2x2 Matrix mit jeder Zelle haben einen Punkt mit dieser Formel (x, y, z), aber ich habe ein Problem in dieser Zeile (ich denke, das Konzept ist falsch !)Wie kann ich 3 Elemente aus einem Array in der einen Zelle in einem anderen Array in Matlab

x(i,j)= cpoints(counter) cpoints(counter+1) cpoints(counter+2); 

komplette Code:

p = [ 1 2 3 4 5 6 7 8 9 10 11 12] 
nr = 2; 
nc =2; 
counter = 0; 
for i=0:(nr-1) 
    for j=0:(nc-1) 
     x(i,j)= p(counter) p(counter+1) p(counter+2); 
     counter = counter +3; 
    end 
end 

ich möchte das Ergebnis so [1,2,3] (4,5,6); (7,8,9) (10,11,12)]

+1

Mehrere Kommentare: (1) Arrays/Matrizen in Matlab können nur primitive Typen enthalten (zB Standard ist ein Doppel) (2 Matrix) (3) das erste Element in einem Array in Matlab hat einen Index von 1, nicht 0 –

Antwort

0

Sie können Schleifen dank der reshape() Funktion, die (wie der Name schon sagt) ein Array umformen. In Ihrem Fall können Sie tun:

p=reshape(p,3,[])';

um

p = 

    1  2  3 
    4  5  6 
    7  8  9 
    10 11 12 

Die reshape Funktion als erste Eingabe nimmt zu bekommen das Array, das Sie neu zu gestalten wollen (p) wie die folgenden Argumente die Dimensionen sind . Allerdings funktioniert reshape() funktioniert das Füllen der neu gestalteten Array von Spalten, während in Ihrem Fall Sie wollen, dass es durch Zeilen gefüllt. Also formulieren wir zunächst das Array mit 3 Zeilen (zweites Argument) und lassen Matlab die Anzahl der Spalten entsprechend auswerten (drittes, leer, Argument). Später transponieren wir (') das Ergebnis, um die endgültige Matrix zu erhalten.

Wenn jedoch aus irgendwelchen Gründen Sie Loops verwenden müssen, eine einfache Lösung sein kann:

nc=3;     % set the number of columns as 3 
nr=numel(p)/nc;   % evaluate the number of rows 
k=1;     % this index will scan vector p 
for i=1:nr    % in Matlab indices start at 1, not 0 
    for j=1:nc 
     x(i,j)=p(k); % fill element (i,j) with the k-th element from p 
     k=k+1;   % keep scanning p 
    end 
end 

Eine letzte Anmerkung: in Matlab können Sie nicht speichern 3 Elemente in einem einzigen Matrixelement. Obwohl Sie eine ganze Reihe füllen können, wie ich oben getan habe, und dann, um das Triplet (x, y, z) zu bekommen, können Sie die ganze Reihe lesen. Um eine ganze Zeile aus der Matrix X zu lesen, können Sie die Syntax X(i,:) verwenden, wobei i der Zeilenindex ist: Dieser Befehl gibt einen Vektor zurück, das ist die Matrixzeile.
Wenn Sie einen Vektor in einem einzelnen Element haben möchten, müssen Sie Zellenarrays und nicht reguläre Matrizen verwenden.

+0

Wenn ich Umformungen verwendet habe kann ich jede Zeile als einen Punkt auf Achsen (x, y, z) in diesem Fall plotten? –

+0

@SamahAhmed Sie wissen, dass sich alle x-Koordinaten in der ersten Spalte befinden, alle y-Koordinaten in der zweiten Spalte und alle z-Koordinaten in der dritten Spalte. Sie können eine ganze Spalte mit dem Befehl 'X (:, i)' lesen, wobei 'i' der Spaltenindex ist (* i = 1,2,3 * in Ihrem Fall). Also plotten Sie im Grunde die erste Spalte vs die zweite Spalte gegen die dritte Spalte – Alessiox

+0

Vielen Dank für Ihre großartige Antwort –

Verwandte Themen