【问题标题】:Finding unique elements of a MATLAB cell array when elements are like '(p,q)'当元素类似于 '(p,q)' 时查找 MATLAB 元胞数组的唯一元素
【发布时间】:2019-07-18 04:00:09
【问题描述】:

我有一个像这样的 MATLAB 元胞数组:

a = {'(q0, q1)' '(q2, q3)' '(q1, q0)' '(q4, q5)'};

'(q0, q1)''(q1, q0)' 在我的应用程序中无所谓,所以我想消除其中一个。您认为最好的方法是什么?

【问题讨论】:

  • 您的最佳衡量标准是什么?最快的?最短?
  • @NickyMattsson 代码行数最少,但现阶段可以接受任何解决方案。
  • 你的元组真的是字符数组吗,即(qx, qy) 是一个长度为 8 的字符数组?只是想事先确定一下。
  • @HansHirse 是的,但它们的大小可能因节点名称而异,例如 (q12, q3) 的长度为 9。

标签: matlab unique cell-array


【解决方案1】:

看起来像HansHirse,我是golfing。 :)

我选择了textscan 路线,最终得到了一个类似但更短的解决方案:

>> a = {'(q0, q1)' '(q0, q1)' '(q2, q3)' '(q1, q0)' '(q4, q5)' '(q12, q3)'};
>> [~, index] = unique(sort(cell2mat(textscan([a{:}], '(q%f, q%f)')), 2), 'rows', 'stable');
>> b = a(index)

b =

  1×4 cell array

    '(q0, q1)'    '(q2, q3)'    '(q4, q5)'    '(q12, q3)'

【讨论】:

    【解决方案2】:

    所以,这是我的建议:

    % Input
    a = {'(q0, q1)' '(q0, q1)' '(q2, q3)' '(q1, q0)' '(q4, q5)' '(q12, q3)'}
    
    % Omit duplicates
    A = unique(a);
    
    % Save for later indexing
    AA = A;
    
    % Length of unique-fied input
    n = length(A);
    
    % Get x of qx by regular expression -> cell array of cell arrays
    A = regexp(A, '\d*', 'match');
    
    % Outer cell array to array + reshape for nicer indexing
    A = reshape(cell2mat(A), 2, n);
    
    % Convert char to num for all cell elements -> array
    A = cellfun (@(x) str2num(x), A);
    
    % Sort indices for each tuple, i.e. (q1, q0) -> (q0, q1)
    A = sort(A)';
    
    % Omit duplicates
    [~, I] = unique(A, 'rows');
    
    % Output
    b = AA(I)
    

    这会导致:

    a =
    {
      [1,1] = (q0, q1)
      [1,2] = (q0, q1)
      [1,3] = (q2, q3)
      [1,4] = (q1, q0)
      [1,5] = (q4, q5)
      [1,6] = (q12, q3)
    }
    
    b =
    {
      [1,1] = (q1, q0)
      [1,2] = (q2, q3)
      [1,3] = (q12, q3)
      [1,4] = (q4, q5)
    }
    

    而且,既然你们都喜欢单线 ;-) :

    a = {'(q0, q1)' '(q0, q1)' '(q2, q3)' '(q1, q0)' '(q4, q5)' '(q12, q3)'}
    [~, ind] = unique(sort(cellfun (@(x) str2num(x), reshape(cell2mat(regexp(a, '\d*', 'match')), 2, length(a))))', 'rows');
    b = a(ind)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-28
      • 2016-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-29
      相关资源
      最近更新 更多