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

このタスク用に設計された組み込み関数を知りませんし、存在しないのではないかと思います。次の 4 つのオプションが表示されます。

  1. 配列のリストを操作する独自の関数を作成します。で何かできるかもしれませんが、これはあなたが疑うほど非効率的である可能性がありますuniquep(:)(2)残念ながら、たとえば、各リスト エントリの 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 内から実行します)。Scilab の強みは、Matlab と同様に、そのベクトル化された操作の速度にあります。データ構造のタイプでベクトル化された関数を使用できない場合は、そのジョブ (またはそのデータ型 - No. 2 を参照) にそのツールを使用する価値があるかどうかを確認する必要があります。

  4. セル要素の性質によっては、それらを数値的にエンコードして行の合計を比較できる場合があります。要素が実際に単一の文字である場合、それぞれを数値に変換し、列の位置に適切な係数を掛けて、次に、行が合計されます。各行の合計を比較すると、重複をより迅速に特定できます。もちろん、データが本当に '21a acacia avenue' である場合、エンコード スキームはハッシュのようになりますが、それでも機能する可能性があります。

于 2013-08-15T10:08:44.603 に答える