die Aufteilung einer Matrix in Spalte Vektoren und speichern in einem array
Meine Frage hat zwei Teile:
- Split eine gegebene matrix in Ihre Spalten
- Diese Spalten gespeichert werden sollen in ein array
eg,
A = [1 3 5
3 5 7
4 5 7
6 8 9]
Nun, ich weiß die Lösung zum ersten Teil:
den Spalten sind erhältlich über
tempCol = A(:,iter), where iter = 1:end
Bezug auf den zweiten Teil des Problems ist, würde ich gerne (etwas wie diese, vielleicht eine andere Indizierung in arraySplit array), sondern eine ganze Spalte Ein, die gespeichert werden soll, die auf eine einzelne index in splitArray:
arraySplit(1) = A(:,1)
arraySplit(2) = A(:,2)
und so weiter...
für die Beispiel-matrix A
,
arraySplit(1)
sollte mir [ 1 3 4 6 ]'
arraySplit(2)
sollte mir [ 3 5 5 8 ]'
Ich erhalte die folgende Fehlermeldung, wenn ich versuche, weisen Sie den Spalten-Vektor für mein array.
In an assignment A(I) = B, the number of elements in B and I must be the same.
Mache ich die Zuweisung und den Zugriff auf arraySplit
falsch, bitte helfen Sie mir ...
- Eine matrix ist bereits ein array von Vektoren, warum brauchen Sie diese unnötige
arraySplit
Raffinesse? - Was in der Regel Streiks neuen matlab-Benutzer ist das komplette fehlen von Zeigern: siehe dieser und dieser Fragen. Abgesehen von cell-arrays, die sind gar nicht nützlich, imho, Sie haben zu Leben, ohne Zeiger und passen Sie Ihre coding-Stil zu dieser Einschränkung. In der Tat, was Sie fordert, ist ein array von Zeigern, so dass
A(i,j)==arraySplit(j)(i)
aber dies ist nicht möglich, mit()
Klammern. - Ich finde jeden Teil Ihres Kommentars falsch: 1) Nicht alle "neuen MATLAB-Benutzer" kommen aus einem C-hintergrund, so zu sagen, dass Sie fehlen, die die Funktionalität von Speicheradressen und Zeiger ist nicht unbedingt wahr. 2) cell-arrays sind SEHR nützlich für die Speicherung von Daten der Variablen Typ als eine Sammlung, wie zahlen und Zeichenketten oder Vektoren unterschiedlicher Länge. 3) Warum sind Sie sicher, dass die OP will, Zeiger anstatt einer Kopie dieser Vektoren?
- tut mir Leid für die verursacht so viel Missbilligung von Ihnen. Im Grunde hast du Recht, mein kurzer Kommentar meint, dass, wenn der OP fragt "eine ganze Spalte Ein, die gespeichert werden soll, die auf eine einzelne index in splitArray" er verlangt für ein C-wie Arrays von arrays. Wie das, was bezüglich cell-arrays, die ich geschrieben haben soll, dass Sie nicht so nützlich, wie Zeiger ersetzt. Der Sinn meines Kommentars war einfach zu machen, dass die OP, die in MATLAB-Daten-Modell für Matrizen (und N-dimensionales array) ist sehr Verschieden von C und numpy.
- Ich wollte nicht zu klingen aggressiv, aber es war wichtig, darauf hinzuweisen, diese Informationen, um nicht in die Irre die OP.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wirklich, es klingt wie
A
ist bereits, was Sie wollen-ich kann mir nicht vorstellen, ein Szenario, wo Sie nichts gewinnen durch die Spaltung von Ihnen bis. Aber wenn Sie das tun, dann Ihre beste Wette ist wahrscheinlich ein cell-array, dh.Edit: Siehe @EitanT ' s Kommentar unten ein eleganter Weg, dies zu tun. Auch der Zugriff auf die Vektor verwendet die gleiche syntax wie Einstellung, z.B.
v = C{2};
wird die zweite Spalte vonA
inv
.C = mat2cell(A, size(A, 1), ones(1, size(A, 2)))
. Auch, sollten Sie vielleicht näher erläutern, wie der Zugriff der einzelnen Spalten mithilfe der geschweiften Klammern.In einem Matlab-array, jedes element muss die gleiche Art sein. In den meisten Fällen einen float-Typ. Ihr Beispiel A(:, 1) ist ein 4-1-array. Wenn Sie zuweisen, sagen wir, B(:, 2), dann B(:, 1) muss auch ein 4-1-array.
Einen gemeinsamen Fehler, der kann Sie beißen, ist, dass ein 4-by-1-array und a 1 von 4 array nicht das gleiche. Ist ein Spalten-Vektor und ist ein zeilenvektor. Versuchen Sie, die Umsetzung Einer(:, 1) erhalten Sie einen 1 von 4 Zeile array.
Könnten Sie versuchen, etwas wie das folgende:
dann rufen Sie
arraySplit(:,:,1)
man den ersten Vektor, aber das scheint mir ein unnötiger Schritt, da Sie können leicht tun, durch den Zugriff auf die exakt gleichen Werte wieA(:,1)
.