2016-03-31 6 views
0

Ich habe versucht, diese nach oben, aber nicht wirklich wissen, was zu suchen ...Wie verbinden Sie N Vektoren in Matrix in Matlab?

Ich muß „table-Join“ N Vektoren, das heißt, eine Matrix, in der ein jeder Eingangsvektor erstellen hat Zeile, und jeder mögliche Eintrag hat eine Spalte.

Auch wäre es schön, einen Translationsvektor zu haben, um eine gute Anbindung an denen Spalte verantwortlich für die Eintragung

zum Beispiel

a = [3, 2, 4, 9] 
b = [3, 1, 5, 9] 
c = [2, 4, 9, 6] 

dann

join(a, b, c) = 
[ 
3; 2; nan; 4; nan; 9; nan, 
3; nan; 1; nan; 5; 9; nan, 
nan; 2; nan; 4; nan; 9; 6, 
] 

mit Übersetzung Vektor

[3,2,1,4,5,9,6] 

Wenn ich also etwas über die i-te Spalte herausfinde, kann ich leicht wissen, was diese Spalte darstellt.

Ich bevorzuge die Join-Operation, um n Vektoren aufnehmen zu können (sie können die gleiche Länge haben), aber 2 ist auch ok.

Auch auf den zweiten Blick erscheint diese Datendarstellung an einigen Stellen ein wenig überflüssig. Vielleicht gibt es einen besseren Weg, um auch die „join-Matrix“

Dank

+0

Ihr Beispiel macht keinen Sinn, in dem 'nicht die von nans' kommen? Lesen Sie auch über 'Tabellen' http://de.mathworks.com/help/matlab/ref/table.html – GameOfThrows

+0

@GameOfThrows, da jede Zeile einen Eingabevektor darstellt und jede Spalte einen Wert darstellt, wenn ein Wert dies nicht tut existieren in einem Eingabevektor, es ist Nan. Ich habe über Tabellen gelesen, bevorzuge aber wenn möglich eine reine Vektorlösung. – Gulzar

+1

Du meinst der Übersetzungsvektor ist '[3,2,1,4,5,9,6]'? – Adiel

Antwort

5

zu repräsentieren Grundsätzlich sollten Sie Ihre Übersetzung Vektor unter Verwendung aller möglichen eindeutigen Eingänge in der Reihenfolge konstruieren, dass sie empfangen wurden. Um dies zu tun, können wir alle Eingaben zusammenhängen, um die eindeutigen Werte zu finden.

values = cat(1, [3, 2, 4, 9], [3, 1, 5, 9], [2, 4, 9, 6]) 
%// 3  2  4  9 
%// 3  1  5  9 
%// 2  4  9  6 


translationVector = unique(values, 'stable') 
%// 3  2  1  4  5  9  6 

Dann wollen wir ismember verwenden, um eine logische Array für einen bestimmten Eingang zurückzukehren angeben, welche Werte unserer Übersetzung Vektor im Eingabeargument vorhanden sind.

columns = ismember(translationVector, [3 2 4 9]) 
%// 1  1  0  1  0  1  0 

Wir wollen dann nur diese Spalten in der Ausgangsmatrix setzen.

output(1, columns) = [3 2 4 9]; 

%// 3  2 NaN  4 NaN  9 NaN 
%// NaN NaN NaN NaN NaN NaN NaN 
%// NaN NaN NaN NaN NaN NaN NaN 

Wir wiederholen dies für alle Ihre Eingabe-Arrays.

Implementierung

Hier ist ein Code, der das erreicht.

function [out, translationVector] = yourjoin(varargin) 

    %// Make sure all inputs are row vectors 
    varargin = cellfun(@(x)x(:).', varargin, 'uni', 0); %' 

    %// compute the translation vector 
    translationVector = unique(cat(1, varargin{:}), 'stable'); 

    %// Pre-allocate your matrix of NaNs 
    out = nan(numel(varargin), numel(translationVector)); 

    %// Fill in each row using each input argument 
    for k = 1:numel(varargin) 
     %// Identify columns that we have 
     toreplace = ismember(translationVector, varargin{k}); 

     %// Set the values of those columns to the input values 
     out(k,toreplace) = varargin{k}; 
    end 
end 

Und dann als Test:

a = [3 2 4 9]; 
b = [3 1 5 9]; 
c = [2 4 9 6]; 

D = yourjoin(a,b,c) 

    3  2 NaN  4 NaN  9 NaN 
    3 NaN  1 NaN  5  9 NaN 
    NaN  2 NaN  4 NaN  9  6 
+0

yeah ... in der Mitte des Schreibens 'ismember'; Nun, ich habe die Frage zuerst falsch verstanden, weil er den Übersetzungsvektor falsch geschrieben hat. – GameOfThrows

+1

@Suever vielleicht 'transvec' als zweiter Ausgang hinzufügen – Dan

+1

@Dan Danke für die Empfehlung. Hinzugefügt. – Suever