2016-03-31 74 views
0

我試圖尋找這件事,但真的不知道要尋找什麼......如何在MATLAB中將N個向量連接到矩陣中?

我需要「表連接」 N載體,意義, 創建,其中每個輸入向量有矩陣行,並且每個可能的條目都有一列。

而且這將是很好有一個平移向量可以方便地前往哪一列是負責哪個入口

例如

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

然後

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, 
] 

與翻譯矢量

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

所以如果我發現了第i列的內容,我可以很容易地知道該列代表什麼。

我更喜歡join操作能夠接受n個向量(它們可以具有相同的長度),但2也是可以的。

此外,乍一看,這些數據表示在某些點上似乎有點多餘。也許有一個更好的辦法,甚至表示「加入矩陣」

感謝

+0

你的例子是沒有意義的,哪裏了'nans'從何而來?你也讀過'tables' http://uk.mathworks.com/help/matlab/ref/table.html – GameOfThrows

+0

@GameOfThrows,因爲每一行代表一個輸入向量,每個列代表一個值,如果一個值沒有存在於一個輸入向量中,它是nan。我已經閱讀過有關表格,但如果可能的話,更喜歡純粹的矢量解決方案 – Gulzar

+1

你的意思是翻譯矢量是'[3,2,1,4,5,9,6]'? – Adiel

回答

5

基本上要構造用,他們接到命令所有可能的獨特的輸入您的翻譯載體。要做到這一點,我們可以將所有輸入連接在一起,而不是找到唯一值。

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 

然後我們想用ismember返回邏輯陣列對於任何給定的輸入來指定哪些我們的翻譯向量的值出現在輸入參數。

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

然後,我們只想設置輸出矩陣中的那些列。

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 

然後,我們對所有輸入數組重複此操作。

執行

這是一些代碼,完成這一點。

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 

然後作爲一個測試:

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

是啊......在寫作'ismember'的過程中,好吧,我首先誤解了這個問題,因爲他寫錯了翻譯向量。 – GameOfThrows

+1

@Suever可能會添加'transvec'作爲第二個輸出 – Dan

+1

@丹感謝您的建議。添加。 – Suever

相關問題