1

在 matlab 或 scilab 中,有人如何删除数组对象列表中的冗余条目?也许将其保存为矩阵?

例子:

p = list();
p(1) = ['a' 'b' 'c'];
p(2) = ['a' 'b' 'c'];
p(3) = ['b' 'a' 'c']

例如,从上面提到的列表开始,我想得到一个列表 q

q(1) = ['a' 'b' 'c'];
q(2) = ['b' 'a' 'c'];

unique 函数仅适用于数组,但不适用于数组列表。我可以通过遍历所有矩阵手动完成此操作,但效率不高。

4

1 回答 1

0

我不知道为此任务设计的内置函数,我怀疑没有。我看到四个选项:

  1. 编写您自己的对数组列表进行操作的函数。尽管您可以使用unique. 不幸的是,当您尝试执行 egp(:)(2)时,就像提取每个列表条目的第二个元素一样,您会得到Not implemented in scilab...

  2. 将数组列表转换为矩阵。我不得不使用 for 循环来做到这一点,这需要地质时间(如果有人知道更好的方法,我很乐意听到它)但是一旦数据以矩阵形式出现,你就可以对它们进行切片,这样可以更容易比较行元素:

    q = ['a' 'b' 'c'; 'd' 'e' 'f']

    then you can do stuff like

    q(:,2)

  3. 保存数据并使用它们的字符串处理功能在 ruby​​ 或 python 中处理它(或编译一些 ruby​​ 或 python 代码并从 scilab 中运行它)。与 Matlab 一样,Scilab 的优势在于其矢量化操作的速度。如果您不能在某种数据结构上使用矢量化函数,那么您必须询问是否值得将该工具用于该工作(或该数据类型 - 参见第 2 项)

  4. 根据单元格元素的性质,您可能能够对它们进行数字编码并比较行总和:如果您的元素确实是单个字符,那么也许每个元素都可以转换为数值,乘以适合其列位置的因子和然后该行求和。比较每一行的总和将为您提供一种更快的方法来识别重复项。当然,如果您的数据真的是“21a acacia avenue”,那么您的编码方案会变得更像哈希,但它可能仍然可行。

于 2013-08-15T10:08:44.603 回答