2

matlab に実装されたクラスタリング アルゴリズムの dll バージョンを作成しました。

また、入力データの作業サンプルをダウンロードし(Toy Problem データを使用しています)、それを読み取り、Matlab の既知のデータ型に変換しています。

ただし、アルゴリズムを実行すると、次のエラーが発生します。

... MWMCR::EvaluateFunction エラー ... 連結されている行列の次元が一致していません。エラー => apclusterSparse.m の 178 行目。

これが私のコードです:(すみません?)

public static double[,] ReadSimilarities()
    {
        string line;
        string[] splittedLine;
        System.IO.StreamReader file = new System.IO.StreamReader("C:\\Code\\FCT\\Thesis\\similarities.txt");

        List<List<string>> values = new List<List<string>>();

        List<string> lineValues;

        while ((line = file.ReadLine()) != null)
        {
            splittedLine = line.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
            lineValues = new List<string>(splittedLine.Count());

            for (int i = 0; i < splittedLine.Count(); i++)
            {
                lineValues.Add(splittedLine[i]);
            }

            values.Add(lineValues);
        }

        file.Close();

        double[,] result = new double[values.Count, 3];

        for (int i = 0; i < values.Count; i++)
        {
            result[i, 0] = Convert.ToDouble(values.ElementAt(i).ElementAt(0));
            result[i, 1] = Convert.ToDouble(values.ElementAt(i).ElementAt(1));
            result[i, 2] = Convert.ToDouble(values.ElementAt(i).ElementAt(2));
        }
        return result;
    }

    public static double[] ReadPreferences()
    {
        string line;
        System.IO.StreamReader file = new System.IO.StreamReader("C:\\Code\\FCT\\Thesis\\preferences.txt");
        List<string> values = new List<string>();

        while ((line = file.ReadLine()) != null)
        {
            values.Add(line);
        }

        double[] result = new double[values.Count];
        for (int i = 0; i < values.Count; i++)
        {
            result[i] = Convert.ToDouble(values.ElementAt(i));
        }

        return result;
    }


    public ActionResult Index()
    {
        ApClusterSparse apClusterSparse = new ApClusterSparse();

        double[,] similarities = ReadSimilarities();
        double[] preferences = ReadPreferences();

        MWNumericArray matLabSimiliaritiesArray = new MWNumericArray(similarities);
        MWNumericArray matLabPreferencesArray = new MWNumericArray(preferences);

        MWArray argsOut;

        try
        {
            argsOut = apClusterSparse.apclusterSparse(matLabSimiliaritiesArray, matLabPreferencesArray);
        }
        catch (Exception e)
        {

        }

        return View();
    }

ありがとう。

4

2 に答える 2

2

pコードの 178 行をざっと見てみると、Nx2 配列をと連結し、それを と連結しているように見えます。sここで、N は として定義されるlength(p)こともあれば、 として定義されることsize(s,1)もありtmpます。

これをデバッグするつもりはありませんが、178 行目より前にNpsおよびの値を表示するか何らかの方法で出力するようにコードを変更することをお勧めしますtmp。これにより、連結できない理由がわかります。次元が異なると思います。

私もお勧めします:

  1. の使用をやめ、一貫してまたはlengthのいずれかを使用してください。入力が10x1または1x10の場合は同じ答えが得られ、連結する前に配列の次元をチェックするために使用するのは適切ではありません。numelsizelength
  2. 複数のステートメント、特に完全なステートメントを 1 行に配置するのはやめてifください。エラーが発生した場合、どのステートメントが原因かわかりません。
  3. 変数の命名を改善します。, , , , , , , , , , , A, a,sと呼ばれる変数がある場合、これをデバッグするのが難しいのは当然のことです。読み進めると頭が痛くなります。ssasrRrppEeeeidxind1ind1sind1eind2sind2etmpidx
于 2013-04-24T16:02:12.613 に答える