修改大型元胞数组以在 MATLAB 中查找满足条件的特定行
Modify large cell array to find certain rows that meet a condition in MATLAB
我有一个单元格矩阵,我想在 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" 中的哪些行感兴趣(Problem 矩阵存储了 TheCell 的某些行索引):
Problem(with M-rows)
例如:
Problem = [3,5,9]
我想找到 TheCell 的所有单元格条目(索引),其中“1”出现在以下任一位置:
Critical = [1;2;3;4;5;6]
因此,例如在问题 (3) 行中,即 TheCell{9},条件在关键 (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
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))
我有一个单元格矩阵,我想在 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" 中的哪些行感兴趣(Problem 矩阵存储了 TheCell 的某些行索引):
Problem(with M-rows)
例如:
Problem = [3,5,9]
我想找到 TheCell 的所有单元格条目(索引),其中“1”出现在以下任一位置:
Critical = [1;2;3;4;5;6]
因此,例如在问题 (3) 行中,即 TheCell{9},条件在关键 (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
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))