我有一个相当大的矩阵,其中第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的索引以创建新数组。有没有人对我能做什么有任何建议?
答案 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