2013-10-30 159 views
2

我有一個相當大的矩陣,其中列1的列表時間在百分之一秒(例如3000 = 30s)和列2中是事件代碼(例如1 =試驗開始,2 =開始的響應,4 =試驗結束)。我用這個更大的矩陣來確定各種指數。然而,現在我需要通過反覆試驗的基礎上(即,基於哪個重複總共60次1和4之間的值來計算在試驗的指數之組成的3個試驗的實例陣列低於:將1個矩陣轉換爲多個矩陣

0  1 
682  2 
987  3 
2586 2 
2593 3 
2598 2 
2601 3 
2602 2 
2605 3 
2607 2 
2608 3 
2635 2 
2636 3 
5546 4 
7321 1 
7826 2 
7900 3 
7901 2 
7902 3 
9481 2 
9730 3 
9877 2 
10319 3 
10431 4 
11158 1 
11361 2 
11376 3 
12209 2 
12267 3 
13547 2 
14159 4 

我想要做的就是填充每個1 & 4對一個新的陣列,例如,該陣列3×1 & 4對一審的將包括以下

Tarray_1 = [0,682,987,2586,2593,2598, 2601, 2602, 2605, 2607, 2608,2635, 2636, 5546; 1,2,3,2,3,2,3,2,3,2,3,2,3,4]; 

有沒有簡單的或者直接做這件事?我花了幾天的時間嘗試使用for循環和find命令來確定索引每1爲了創建新的陣列。有人對我能做什麼有任何建議嗎?

回答

0

這裏有一種方法,如果我理解丁磊這個正確,:

A = [0  1; 
682  2; 
987  3; 
2586 2; 
2593 3; 
2598 2; 
2601 3; 
2602 2; 
2605 3; 
2607 2; 
2608 3; 
2635 2; 
2636 3; 
5546 4; 
7321 1; 
7826 2; 
7900 3; 
7901 2; 
7902 3; 
9481 2; 
9730 3; 
9877 2; 
10319 3; 
10431 4; 
11158 1; 
11361 2; 
11376 3; 
12209 2; 
12267 3; 
13547 2; 
14159 4]; 




% all even codes 
evenCodes = A(:, 2); 


% find positions of valus 4 in the even cods 
[indx c] = find(evenCodes == 4); 


% just append 0 to the idx array 
newIdxOfFours = [0, indx']; 


% cell cointaining Tarrays, e.g. outCell{1} is Tarray_1 
TarrayCell = {}; 

for i = 1:length(newIdxOfFours) - 1 

    % find starting and ending index/row for each trial 
    startIdx = newIdxOfFours(i) + 1; 
    endIdx = newIdxOfFours(i+1); 

    TarrayCell{end + 1} = A(startIdx:endIdx, :)'; 


end 

TarrayCell{1} 
TarrayCell{2} 
TarrayCell{3} 

>> 
ans = 

      0   682   987  2586  2593  2598  2601  2602  2605  2607  2608  2635  2636  5546 
      1   2   3   2   3   2   3   2   3   2   3   2   3   4 


ans = 

     7321  7826  7900  7901  7902  9481  9730  9877  10319  10431 
      1   2   3   2   3   2   3   2   3   4 


ans = 

     11158  11361  11376  12209  12267  13547  14159 
      1   2   3   2   3   2   4 
0

我寫了這段代碼,它可以處理你的代碼,然而取決於你需要這些矩陣做什麼,讓它們在單元格中可能會很麻煩。但在沒有其他答案的情況下,這應該可以做到。我複製了你給出的大矩陣,並稱之爲A

[F,I]=find(A(:,2)==4); 
T=cell(1,sum(I)); 
T{1}=A(1:F(1),:); 
for j=2:sum(I) 
    T{j}=A(F(j-1)+1:F(j),:); 
end 

這使得矩陣,T的單元陣列,並且可以通過使用例如得到任何矩陣出:T{1},或用例如訪問特定元素:T{1}(2,1)

編輯:這假設矩陣以1開始,而另一個1總是跟在4. Chappjc的答案可能會更好。

4

給定一個n-by-2矩陣M,這裏只有兩個命令的簡單方法:

>> trialStartEnd = [find(M(:,2)==1) find(M(:,2)==4)] 

trialStartEnd = 

    1 14 
    15 24 
    25 31 

>> T = arrayfun(@(x,y) M(x:y,:)',trialStartEnd(:,1),trialStartEnd(:,2),'uni',0) 

T = 

    [2x14 double] 
    [2x10 double] 
    [2x7 double] 

每個試驗在T的單元格中有它自己的數組。