【问题标题】:Matlab exception while using C# wrapper使用 C# 包装器时的 Matlab 异常
【发布时间】:2013-04-18 06:00:09
【问题描述】:

我已经做了一个clustering algorithm implemented in matlab的dll版本

另外,我下载了working sample of the input data(我正在使用玩具问题数据),我正在阅读它并将其转换为 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();
    }

谢谢。

【问题讨论】:

  • 你在纯 MATLAB 中测试过吗?听起来它期望输入的形状与您提供的形状不同(例如,列与行向量)。
  • 是的,我做到了。实际上,这个示例是用于使用该算法的在线演示......
  • 其实,我试过不止一个例子,我得到了同样的错误。

标签: c# .net matlab matlab-compiler


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    我也建议:

    1. 停止使用length,并始终使用numelsize。如果length 的输入是 10x1 或 1x10,则它会给出相同的答案,并且不适合在连接之前检查数组的尺寸。
    2. 停止将多个语句放在一行中,尤其是完整的if 语句。如果有错误,你不知道是哪个语句导致的。
    3. 改进变量命名。当您有名为AasssasrRrpp、@ 的变量时,这很难调试也就不足为奇了987654344@、eeeidxind1ind1sind1eind2sind2etmpidx。读完让我头疼。

    【讨论】:

    • 我如何理解你们的 cmets。但是请注意,这段代码不是我的,我已经尝试过(并且正在使用)算法内部示例。但是,只有当我尝试在 C# 中运行它时(在我使用 Matlab Builder NE 生成 dll 之后)我才会收到此错误...
    • 所以如果它是完全相同的代码,只是编译,那么 C# 必须给它不同的输入。也许它将matlabPreferencesArray 作为 Nx1 而不是 1xN 传递,或者 matlabSimilaritiesArray 是长度向量 (NxN) 而不是 NxN 数组。就像我建议的那样,修改代码,使其在错误行 178 之前显示其状态 - 然后你就可以知道为什么 MATLAB 不能进行连接。
    猜你喜欢
    • 2020-07-12
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多