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

时间:2015-10-05 20:27:24

标签: string octave

让一些变量是字符串abac,例如:

un =
{
  [1,1] = abac
}

我需要将其转换为abc,即删除3d符号a。 我没有想法如何使用字符串八度函数进行非常好的变换。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

要在单元格数组中的单个字符串中查找唯一符号,请使用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选项来关闭此行为。

答案 1 :(得分:1)

如果你想要它们出现在原始字符串上的顺序中的唯一字符,答案仍然是unique,但你需要它的第二个参数,它返回每个元素的第一个(或最后一个)索引。

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
}