2016-01-19 85 views
3

我正在與ANX 1矩陣,A,已重複裏面值的工作行到一個新的列:移位重複以矩陣

A = [0;1;2;3;4; 0;1;2;3;4; 0;1;2;3;4; 0;1;2;3;4] 

其對應於B值的NX 1個矩陣:

B = [2;4;6;8;10; 3;5;7;9;11; 4;6;8;10;12; 5;7;9;11;13] 

我試圖產生一個廣義碼給每個重複放入一個單獨的列,並將其存儲到AA和BB,例如:

Aa = [0 0 0 0  Bb = [2 3 4 5 
     1 1 1 1   4 5 6 7 
     2 2 2 2   6 7 8 9 
     3 3 3 3   8 9 10 11 
     4 4 4 4]   10 11 12 13] 

從本質上講,從A和B每次重複需要被複制到下一列,然後從第一列

Visual description of matrix row shifting to columns (paint)

到目前爲止,我已經成功地確定有多少重複有並複製整個刪除列轉到下一列,然後是下一個重複次數,但是我的方法不會將矩陣行轉換爲列。

clc;clf;close all 
A = [0;1;2;3;4;0;1;2;3;4;0;1;2;3;4;0;1;2;3;4]; 
B = [2;4;6;8;10;3;5;7;9;11;4;6;8;10;12;5;7;9;11;13]; 

desiredCol = 1; %next column to go to 
destinationCol = 0; %column to start on 
n = length(A); 
for i = 2:1:n-1 
if A == 0; 
    A = [ A(:, 1:destinationCol)... 
     A(:, desiredCol+1:destinationCol)... 
     A(:, desiredCol)... 
     A(:, destinationCol+1:end) ]; 
end 
end 

A = [...]從Move a set of N-rows to another column in MATLAB

任何提示,將不勝感激檢索。如果您需要進一步解釋,請告訴我!

謝謝!

+6

在回答您之前,您需要回答幾個問題:(1)將保證**重複嗎?例如,如果'A = [0 1 2 3 0 3 2 1];'? (2)如果'A'保證重複,那麼你知道**期嗎?例如,我們可以在這裏看到這個時期是5個樣本。這是事先知道的,還是你必須自己計算一下?如果你知道週期性,你的答案就是'Aa = reshape(A,T,[]); Bb =重塑(B,T,[]);'其中'T'是週期。 (3)'A'只有**獨特**元素嗎?如果'A = [1 1 1 1];'?會發生什麼?模式1,2或4之間的時間段是? – rayryeng

+1

感謝您的回覆。 A保證重複,但期限會有所不同。儘管這可以通過「n =長度(A); T = n/An」容易地計算,其中An是重複次數。 A將只有等距的獨特元素。考慮到這一切,我會嘗試給你重塑命令,讓你知道!當你在stackoverflow上提問時,你給了我很多想法,所以謝謝! – Azaxa

+2

:)。與回答問題相比,在StackOverflow上提出問題需要更多的藝術和實踐。我發現在提出問題時,我必須不斷回來並提供更多細節,因爲在提出問題時我沒有考慮某些情況。然而,有了答案,我很少需要編輯,因爲我清楚知道我要寫什麼。別擔心,你不是唯一一個這樣認爲的人......並且讓我知道它是如何與「重塑」的。如果確實有效,請允許我寫出正式答案。祝你好運! – rayryeng

回答

2

鑑於我們在評論中討論,你需要的是使用reshape知道哪個維度的矩陣轉換成具有特定尺寸的前提是輸出矩陣元素匹配的數量。您希望將具有一定數量的重複模式的矢量轉換爲矩陣,其中每列具有這些重複實例之一。 reshape按列 - 主要順序創建矩陣,其中按列方式對值進行採樣,並以此方式填充矩陣。這對你的情況是完美的。

假設你已經知道你有多少「重複」期待,我們稱這種An,你只需要重塑你的載體,使其具有T = n/An行,其中n是向量的長度。像這樣的東西會奏效。

n = numel(A); T = n/An; 
Aa = reshape(A, T, []); 
Bb = reshape(B, T, []); 

第三個參數具有空括號,這告訴MATLAB來推斷有多少列有將給予有T行。從技術上講,這只是An列,但很高興向您展示MATLAB的靈活性。

2

如果你說你已經知道了重複子矢量,然後它重複的次數是比較直截了當:

首先讓你的新A矩陣與repmat功能。 然後重新映射B矢量相同的大小,你的新A矩陣

% Given that you already have the repeated subvector Asub, and the number 
% of times it repeats; An: 


Asub = [0;1;2;3;4]; 
An = 4; 
lengthAsub = length(Asub); 

Anew = repmat(Asub, [1,An]); 

% If you can assume that the number of elements in B is equal to the number 
% of elements in A: 

numberColumns = size(Anew, 2); 

newB = zeros(size(Anew)); 
for i = 1:numberColumns 
    indexStart = (i-1) * lengthAsub + 1; 
    indexEnd = indexStart + An; 
    newB(:,i) = B(indexStart:indexEnd); 
end 

如果你不知道什麼是你原來的A載體,但你知道它是重複的,如果你假設模式有沒有重複,你可以使用find功能查找時,第一個元素被重複:

lengthAsub = find(A(2:end) == A(1), 1); 
Asub = A(1:lengthAsub); 
An = length(A)/lengthAsub 

希望這適合在與您的數據:唯一原因,它不會是,如果內A你的子向量是做一個模式沒有獨特的數字,成功H作爲:

A = [0;1;2;3;2;1;0; 0;1;2;3;2;1;0; 0;1;2;3;2;1;0; 0;1;2;3;2;1;0;] 

值得注意的是,從上面的直覺你會lengthAsub = find(A(2:end) == A(1), 1) - 1;,但是這是沒有必要的,因爲你已經有效地只關注在矩陣A(2:end)採取一關。