从 MATLAB/octave 中的字符串中删除非唯一字符

Remove non-unique chars from string in MATLAB/octave

设某变量为字符串abac,例如:

un =
{
  [1,1] = abac
}

我需要将其转换为 abc,即删除 3d 符号 a。 我不知道如何在不使用字符串八度函数的情况下使其变得简单。有什么想法吗?

要查找元胞数组中单个字符串中的唯一符号,请使用 unique:

un =
{
  [1,1] = abac
  [1,2] = asdlfkjasdf
}

>> unique(un{1})
ans = abc
>> unique(un{2})
ans = adfjkls

要一次查找所有字符串的唯一元素,请将 cellfununique 结合使用:

>> cellfun(@unique,un,'UniformOutput',false)
ans =
{
  [1,1] = abc
  [1,2] = adfjkls
}

请注意,默认情况下 unique 对结果的元素进行排序,与 Matlab 不同,Octave 没有 stable 选项来关闭此行为。

如果您希望唯一字符按照它们在原始字符串中出现的顺序排列,答案仍然是 unique 但您需要它的第二个参数,即 returns 第一个(或最后一个)索引每个元素。

octave> charv = "aaccbbahbc"
charv = aaccbbahbc
octave> [~, i] = unique (charv, "first")
i =

   1   5   3   8

octave> charv(sort (i))
ans = acbh

或单行:

octave> charv(sort (nthargout (2, @unique, charv, "first")))
ans = acbh

如果元胞数组中有很多字符串,它会变得有点复杂:

octave> charcv = {"aaccbbahbc", "erfyergfas"}
charcv = 
{
  [1,1] = aaccbbahbc
  [1,2] = erfyergfas
}
octave> [~, i] = cellfun (@unique, charcv , {"first"}, "UniformOutput", false)
i = 
{
  [1,1] =

     1   5   3   8

  [1,2] =

      9    1    3    7    2   10    4

}
octave> i = cellfun (@sort, i, "UniformOutput", false)
i = 
{
  [1,1] =

     1   3   5   8

  [1,2] =

      1    2    3    4    7    9   10

}
octave> cellfun (@subsref, charcv, num2cell (struct ("type", "()", "subs", num2cell (i))), "UniformOutput", false)
ans = 
{
  [1,1] = acbh
  [1,2] = erfygas
}