1

次のような文字列として与えられたデータで満たされた Octave/Matlab 行列があるとします。

N =

 Columns 1 through 6:

  0.0000e+000  0.0000e+000  0.0000e+000  0.0000e+000  0.0000e+000  0.0000e+000
  0.0000e+000  0.0000e+000  2.3423e+008  1.0809e+009  1.6893e+010  6.5398e+008

 Columns 7 through 12:

  0.0000e+000  0.0000e+000  0.0000e+000  0.0000e+000  0.0000e+000  0.0000e+000
  3.3553e+009  6.9347e+010  3.5653e+010  2.7392e+011  2.1380e+008  7.9962e+009

 Columns 13 and 14:

  9.0266e+015  2.6575e+007
  9.0265e+015  1.2970e-008

したがって、各列には値のリストがあります(ここでは、各列には2さらに多くの行を含めることができますが、その数はわかりません。その文字列が与えられる前に、列の合計量がわかります)

そのような獣をlist<list<double> >実行時に (指定された文字列から) C# に解析する方法は?

4

1 に答える 1

1

行列をファイル(Octave/Matlab) に書き込むことから始める必要があります。これらのファイルには一貫した形式があり、データを引き出すことができます。

そして、Octave 行列を .NET に解析するコードがいくつかあります。カーテンの後ろの TODO は気にしないでください。これはより大きなクラスの一部ですが、それがほとんどです。重要な情報が不足しているように見える場合は、コメントを追加してください。掘り下げます。

Dictionary<string, object> variables;

private bool ReadAllVariablesFromDataFile(string[] lines)
{
    int i = 0;

    while (i < lines.Length)
    {
        string line = lines[i];
        int oldI = i;
        i = ReadSingleVariable(i, lines);
    }

    return true;
}

private static bool IsDefinitionLine(string line)
{
    return (line != null && line.TrimStart().StartsWith("#"));
}

private int ReadSingleVariable(int startIndex, string[] lines)
{
    // TODO: Types other than matrix.
    OctaveVariable variable = new OctaveVariable();

    while (IsDefinitionLine(lines[startIndex]))
    {
        ProcessDefinitionLine(variable, lines[startIndex]);
        startIndex++;
    }

    if (!variable.IsInitialized)
    {
        return startIndex;
    }

    for (int i = 0; i < variable.Rows; i++)
    {
        ProcessDataLine(variable, lines[startIndex + i], i);
    }

    this.variables.Add(variable.Name, variable.Value);

    return startIndex + variable.Rows;
}

private static void ProcessDefinitionLine(OctaveVariable variable, string line)
{
    string value = GetLineValue(line);

    switch (GetLineId(line))
    {
        case "name":
            variable.Name = value;
            variable.IsInitialized = true;
            break;
        case "rows":
            variable.Rows = int.Parse(value);
            break;
        case "columns":
            variable.Columns = int.Parse(value);
            break;
        default:
            break;
    }
}

private static void ProcessDataLine(OctaveVariable variable, string line, int rowIndex)
{
    string[] values = line.Trim().Split(' ');
    double[] row = new double[variable.Columns];

    for (int i = 0; i < variable.Columns; i++)
    {
        variable.Value[rowIndex, i] = double.Parse(values[i]);
    }
}

private static string GetLineId(string line)
{
    return line.Split(':').First().TrimStart('#').Trim().ToLowerInvariant();
}

private static string GetLineValue(string line)
{
    string[] pair = line.Split(':');
    if (pair.Length < 2)
    {
        throw new ArgumentException("Invalid def line");
    }

    return pair[1].Trim();
}
于 2013-03-21T23:47:18.910 に答える