2013-10-30 119 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的单元格中有它自己的数组。