MATLAB:检查单元格数组中的值是否保持不变

时间:2015-07-09 10:56:50

标签: arrays matlab equality cell-array

我的问题可能有点“愚蠢”,但我被困在这里,所以我真的需要你的帮助。

所以,我们有一个单元格数组Q 5520x1 ,如下所示:

enter image description here

我只对每行的前两个数字感兴趣。要明确说明,给予

K>> Q {1}

  

ans = 0 1 0 238

我只关心0和1,依此类推其他行。 只有每行的前两个数字。让我们忽略Q的每一行中的其余值,它们或多或少都无关紧要。

我的问题是,如何检查单元格数组Q中每一行的第一个值(在0以上的示例中)是否保持不变?我想要实现的是,而第一个值是相同的,我想存储在另一个单元格数组中,所有第二个值。在数字0的情况下,我想存储值

  

[1,3,127,129,216,217,252,253,302,303,342,343]

等等。怎么可以这样做?

非常感谢任何帮助或建议。

3 个答案:

答案 0 :(得分:2)

您可以按如下方式使用uniqueaccumarray

Q = {[0 1 0 238]
     [0 3 1 84]
     [1 2 1 85]
     [3 4 5 6]}; %// example data. Cell array of equal-size row vectors
Qm = vertcat(Q{:}); %// convert Q into matrix
[vals, ~, id] = unique(Qm(:,1)); %// get unique id for 1st col
result = accumarray(id, Qm(:,2), [], @(x){x.'}); %'// gather 2nd col values according to id

这给出了:

vals =
     0
     1
     3

result{1} =
     1     3
result{2} =
     2
result{3} =
     4

答案 1 :(得分:2)

% Example Q
Q = {[0 1 135 134];
     [0 3 154 26];
     [0 16 146 234];
     [1 2 324 125];
     [1 7 213 252]};
A = cell2mat(Q(1:2760));
[~,~,ind2] = unique(A(:,1));
C = arrayfun(@(x)A(find(ind2==x),2),1:max(ind2),'UniformOutput',false);

C{1}

ans =

     1
     3
    16

C{2}

ans =

     2
     7

答案 2 :(得分:0)

您可以使用for循环执行此操作:

cell_range = max(cellfun(@(x) x(1),Q));
C = cell(cell_range,1)
for i = 1:length(Q)
    M = Q{i};
    disp(M(1));
    C{M(1)} = [C{M(1)}, M(2)];
end