将1个矩阵转换为多个矩阵

时间:2013-10-30 05:19:23

标签: matlab matrix

我有一个相当大的矩阵,其中第1列以100秒(例如3000 = 30s)列出时间,第2列是事件代码(例如1 =开始试验,2 =开始响应,4 =结束审判)。我使用这个更大的矩阵来确定各种指数。但是,现在我需要通过试验计算一个试验的指数(即基于1到4之间的值,重复总共60次。由3个试验组成的示例阵列如下:

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和1填充一个新数组。例如,在这个3×1& 3的阵列中,有4对。 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的索引以创建新数组。有没有人对我能做什么有任何建议?

3 个答案:

答案 0 :(得分: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的单元格中都有自己的数组。

答案 1 :(得分: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的答案可能更好。

答案 2 :(得分: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