2013-04-24 5 views
2

Я сделал версию библиотеки DLL в виде clustering algorithm implemented in matlabMatlab исключения при использовании C# обертки

Кроме того, я скачал working sample of the input data (я использую данные игрушки проблемы) и я читаю его, а также преобразование это к известному типу данных Matlab.

Однако при выполнении алгоритма я получаю следующее сообщение об ошибке:

... MWMCR::EvaluateFunction error ... Dimensions of matrices being concatenated are not consistent. Error in => apclusterSparse.m at line 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(); 
    } 

Спасибо.

+0

Вы протестировали его в чисто MATLAB? Похоже, что он ожидает ввода другой формы, чем то, что вы ей даете (например, столбец против вектора строк). – wakjah

+0

Да, я это сделал. На самом деле это образцы для онлайн-демонстраций, которые используют этот алгоритм ... – dwbrito

+0

На самом деле, я попытался с несколькими примерами, и я получаю ту же ошибку. – dwbrito

ответ

0

Проблема заключалась в том, что аргумент P не должен быть массивом (как на входе на веб-сайт), а вместо этого является скаляром.

2

С беглый взгляд на линии 178 вашего кода, это выглядит, как вы конкатенации массив NX2 с p, а затем конкатенации, что с s, где иногда N определяется как length(p), иногда size(s,1) и иногда как-то tmp.

Я не собираюсь отладки это, но я хотел бы предложить, что делать, так что вы должны изменить свой код так, что до линии 178 это показывает, или как-то выводит, значения N, p, s и tmp. Это даст вам представление о том, почему они не могут быть объединены - я предполагаю, что они имеют разные размеры.

Я также предлагаю:

  1. Прекратите использование length, и использовать либо numel или size последовательно. 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 , Мне больно читать.
+0

Насколько я понимаю ваши комментарии. Однако учтите, что этот код не мой, и я пробовал его (и работал) с внутренними образцами алгоритма. Тем не менее, только когда я пытаюсь запустить его на C# (после того, как я сгенерировал dll с помощью Matlab Builder NE), я получаю эту ошибку ... – dwbrito

+3

Итак, если это тот же самый код, просто скомпилированный, то C# должен давать ему разные входы.Возможно, это передача 'matlabPreferencesArray' как Nx1, а не 1xN, или, может быть,' matlabSimilaritiesArray' является вектором длины (NxN) вместо массива NxN. Как я и предложил, измените код так, чтобы он отображал его состояние непосредственно перед строкой 178 ошибок - тогда вы сможете узнать, почему MATLAB не может выполнить конкатенацию. –

+0

+1 для пункта 3. – Daniel