在 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};