fork download
  1. function c = unique_stable(a)
  2. [c, ~, ic] = unique(a);
  3. ia = arrayfun(@(n) find(ic == n)(1), 1:numel(c));
  4. c = a(sort(ia));
  5. end
  6. function b = unionize_if_intersect(b)
  7. if size(b, 1) < 2, return, end
  8. for i = 1:size(b, 2)
  9. k = find(b(:, i));
  10. if 1 < numel(k)
  11. b(k(1), :) = any(b(k, :));
  12. b(k(2:end), :) = [];
  13. end
  14. end
  15. end
  16. function c = f(a)
  17. u = unique_stable(cell2mat(cellfun(@(s) {strsplit(s, "=")}, a)));
  18. s2b = @(s) any(cell2mat(cellfun(@(k) {strcmp(u, k)}, strsplit(s, "=")')));
  19. b = unionize_if_intersect(cell2mat(cellfun(@(s) {s2b(s)}, a')));
  20. c = arrayfun(@(r) {u(b(r, :))}, 1:size(b, 1)');
  21. end
  22. a = {"a1=a2", "b1=b2", "b3=b2", "c1=c2", "e1=e2", ...
  23. "a3=a4", "c3=c4", "e1=e3", "a2=a4", "c3=c1", ...
  24. "b3=a4", "c2=d1", "a4=a5", "d2=c1", "b4=b3", "d3=c3"};
  25. disp(['[' strjoin(cellfun(@(s) {['["' strjoin(s, '", "') '"]']}, f(a)), ', ') ']'])
Success #stdin #stdout 0.12s 47220KB
stdin
Standard input is empty
stdout
[["a1", "a2", "b1", "b2", "b3", "a3", "a4", "a5", "b4"], ["c1", "c2", "c3", "c4", "d1", "d2", "d3"], ["e1", "e2", "e3"]]