在 Matlab 中为特定条件分配新矩阵
Assign new matrices for a certain condition, in Matlab
我有一个矩阵,DataFile=8x8。其中一列(第 6 列或 "coarse event")只能是 0 或 1。对于不稳定的条件,它将是 0,对于稳定的 condition.Now,它将是 1,例如:
DataFile = [ 11 5 66 1.2 14.1 0 -1 0.1;...
12 6 67 1.4 15.1 0 -1 0.1;...
13 7 68 1.6 16.1 1 -1 0.2;...
14 8 69 1.7 16.5 1 -2 0.1;...
15 9 68 1.6 16.2 0 -1 0.3;...
16 8 66 1.3 15.7 1 -2 0.0;...
17 5 65 1.5 16.1 1 0 0.0;...
18 6 66 1.2 16.6 0 1 1.0];
对评论中的代码稍作改动:
DataFile =[zeros(1,size(DataFile,2)); DataFile; zeros(1,size(DataFile,2))];
startInd = [find(diff(DataFile(:,6))==1)];
endInd = [find(diff(DataFile(:,6)) <0)];
B={};
for n=1:1:numel(endInd)
B(n)={DataFile(startInd(n):endInd(n),:)};
end
FirstBlock=B{1};
SecondBlock=B{2};
结果是 2 个矩阵(FirstBlock=3x8,SecondBlock=3x8),在第 6 列中错误地包含了 0。它应该给出两个矩阵(dataIs1(1)=2x8 和 dataIs1(2)=2x8),第 6 列中只有 1。
实际上我想要 n 个矩阵,其中 "coarse event" 是 1。谢谢您的帮助!
魔法词是logical indexing:
如果你有矩阵 A:
A=[1 2 3 4 5;...
0 6 7 8 9;...
1 7 8 9 10]
您可以通过以下方式提取第 1 行和第 2 行:
B=A(A(:,1)==1)
希望这就是您要找的东西,玩得开心。
要分开组,我们需要知道它们的起点和终点:
endInd = [find(diff(A(:,1))<0) size(A,1)]
startInd = [1 find(diff(A(:,1))==1)]
然后将数据分配给数组:
B={};
for n=1:1:numel(endInd)
B(n)={A(startInd(n):endInd(n),:)};
end
编辑:
您的新数据:
DataFile = [ 11 5 66 1.2 14.1 0 -1 0.1;...
12 6 67 1.4 15.1 0 -1 0.1;...
13 7 68 1.6 16.1 1 -1 0.2;...
14 8 69 1.7 16.5 1 -2 0.1;...
15 9 68 1.6 16.2 0 -1 0.3;...
16 8 66 1.3 15.7 1 -2 0.0;...
17 5 65 1.5 16.1 1 0 0.0;...
18 6 66 1.2 16.6 0 1 1.0];
我添加了一些填充以避免错误:
DataFile =[zeros(1,size(DataFile,2)); DataFile; zeros(1,size(DataFile,2))]
现在,和以前一样,我们寻找块的起点和终点:
endInd = [find(diff(A(:,1)) <0) -1]
startInd = [find(diff(A(:,1))==1)]
然后将数据分配给数组中的一个单元格:
B={};
for n=1:1:numel(endInd)
B(n)={A(startInd(n):endInd(n),:)};
end
如果你想检索,比如说,第二个块:
secondBlock=B{2};
我有一个矩阵,DataFile=8x8。其中一列(第 6 列或 "coarse event")只能是 0 或 1。对于不稳定的条件,它将是 0,对于稳定的 condition.Now,它将是 1,例如:
DataFile = [ 11 5 66 1.2 14.1 0 -1 0.1;...
12 6 67 1.4 15.1 0 -1 0.1;...
13 7 68 1.6 16.1 1 -1 0.2;...
14 8 69 1.7 16.5 1 -2 0.1;...
15 9 68 1.6 16.2 0 -1 0.3;...
16 8 66 1.3 15.7 1 -2 0.0;...
17 5 65 1.5 16.1 1 0 0.0;...
18 6 66 1.2 16.6 0 1 1.0];
对评论中的代码稍作改动:
DataFile =[zeros(1,size(DataFile,2)); DataFile; zeros(1,size(DataFile,2))];
startInd = [find(diff(DataFile(:,6))==1)];
endInd = [find(diff(DataFile(:,6)) <0)];
B={};
for n=1:1:numel(endInd)
B(n)={DataFile(startInd(n):endInd(n),:)};
end
FirstBlock=B{1};
SecondBlock=B{2};
结果是 2 个矩阵(FirstBlock=3x8,SecondBlock=3x8),在第 6 列中错误地包含了 0。它应该给出两个矩阵(dataIs1(1)=2x8 和 dataIs1(2)=2x8),第 6 列中只有 1。
实际上我想要 n 个矩阵,其中 "coarse event" 是 1。谢谢您的帮助!
魔法词是logical indexing:
如果你有矩阵 A:
A=[1 2 3 4 5;...
0 6 7 8 9;...
1 7 8 9 10]
您可以通过以下方式提取第 1 行和第 2 行:
B=A(A(:,1)==1)
希望这就是您要找的东西,玩得开心。
要分开组,我们需要知道它们的起点和终点:
endInd = [find(diff(A(:,1))<0) size(A,1)]
startInd = [1 find(diff(A(:,1))==1)]
然后将数据分配给数组:
B={};
for n=1:1:numel(endInd)
B(n)={A(startInd(n):endInd(n),:)};
end
编辑: 您的新数据:
DataFile = [ 11 5 66 1.2 14.1 0 -1 0.1;...
12 6 67 1.4 15.1 0 -1 0.1;...
13 7 68 1.6 16.1 1 -1 0.2;...
14 8 69 1.7 16.5 1 -2 0.1;...
15 9 68 1.6 16.2 0 -1 0.3;...
16 8 66 1.3 15.7 1 -2 0.0;...
17 5 65 1.5 16.1 1 0 0.0;...
18 6 66 1.2 16.6 0 1 1.0];
我添加了一些填充以避免错误:
DataFile =[zeros(1,size(DataFile,2)); DataFile; zeros(1,size(DataFile,2))]
现在,和以前一样,我们寻找块的起点和终点:
endInd = [find(diff(A(:,1)) <0) -1]
startInd = [find(diff(A(:,1))==1)]
然后将数据分配给数组中的一个单元格:
B={};
for n=1:1:numel(endInd)
B(n)={A(startInd(n):endInd(n),:)};
end
如果你想检索,比如说,第二个块:
secondBlock=B{2};