2

我已经制作了一个在 matlab 中实现的聚类算法的 dll 版本

此外,我下载了输入数据的工作示例(我正在使用玩具问题数据),我正在阅读它并将其转换为 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

快速查看代码的第 178 行,您似乎将 Nx2 数组与p连接,然后将其与 连接s,其中有时 N 定义为length(p),有时定义为 ,有时定义size(s,1)tmp

我不打算对此进行调试,但我建议这样做您应该修改您的代码,以便在第 178 行之前显示或以某种方式输出 、Npstmp。这将使您了解为什么它们不能被连接 - 我猜它们有不同的维度。

我还建议:

  1. 停止使用length,并使用其中一个numelsize始终使用。length如果它的输入是 10x1 或 1x10,则给出相同的答案,并且在连接之前用于检查数组的维度不是正确的。
  2. 停止将多个语句放在一行上,尤其是完整的if语句。如果有错误,你不知道是哪个语句引起的。
  3. 改进你的变量命名。A当您有名为, a, s, ss, as, r, R, rp, p, , E, e, ee, idx, ind1, ind1s, ind1e, ind2s,ind2e和的变量时,这很难调试也就不足为奇了tmpidx。读完它让我头疼。
于 2013-04-24T16:02:12.613 回答
0

问题在于参数 P 不能是一个数组(如网站输入中的那样),而是一个标量。

于 2013-04-24T16:49:15.690 回答