修改大单元格数组以查找满足MATLAB条件的某些行

时间:2016-02-09 14:07:16

标签: arrays matlab cell reshape cells

我有一个我希望在MATLAB中分析某些行的单元矩阵。我自己的解决方案非常糟糕(见底部),所以我认为有人可以给我一个如何改进它的提示。我很确定,我只需要以某种方式重塑单元阵列,但我不太清楚如何做到这一点。

我有一个包含逻辑数组条目的单元格:

TheCell{with N-rows cell}(Logical Array with varying length, but max 24 entries)

例如:

TheCell{1} = [0,1,0,1,0,0,0,0,0,1,0]
TheCell{2} = [0,0,0,0]
...
TheCell{9} = [0,1,0,0,0,0,0]

此外,我有一个名为Problem的矩阵告诉我" TheCell"我对(问题矩阵存储了一些TheCell的行索引)感兴趣:

Problem(with M-rows)

例如:

Problem = [3,5,9]

我想找到TheCell的所有单元格条目(索引),其中a" 1"出现在以下任一位置:

Critical = [1;2;3;4;5;6]

因此,例如在行问题(3)中,即TheCell {9},条件在Critical(2)处得到满足,因为:

TheCell{Problem(3)}(Critical(2)) == 1

因此,我可以在我的解决方案矩阵中创建一个新条目:

Solution(counter) = Problem(3)

最后,我在一个糟糕的解决方案中实现了这一点,并不是非常有效。

Critical = [1;2;3;4;5;6];
Solution = [];
counter = 1;
for i = 1:length(Problem)
   Row = Problem(i);
   b = length(TheCell{Row})
   for k = 1:length(Critical)
        if k > b
           break;
        end  
        if TheCell{Row}(Critical(k))==1
            Solution(counter) = Row;
            counter = counter+1;
            break;
        end
    end
end

1 个答案:

答案 0 :(得分:3)

Critical = 6;
find(cellfun(@(x)any(x(1:min(Critical,end))), TheCell))

Critical永远不会是从1开始的连续数字

Critical = [2,4,5];
find(cellfun(@(x)any(x(min(Critical,end))), TheCell))

如果您可以控制TheCell的创建方式,则可以通过不使用单元格数组来获得更有效的解决方案,而是使用false填充每行的末尾。

例如

TheMatrix = false(9,24);

%// You would generate this more sensibly in your process
TheMatrix(1,1:11) = [0,1,0,1,0,0,0,0,0,1,0]
TheMatrix(2,1:4) = [0,0,0,0]
...
TheMatrix(9,1:7) = [0,1,0,0,0,0,0]

然后解决方案是:

find(any(TheMatrix(:,Critical),2))