【问题标题】:Calculating Matlab .m file in c# [closed]在 C# 中计算 Matlab .m 文件 [关闭]
【发布时间】:2016-01-29 05:10:13
【问题描述】:

我有一个包含大量时间序列信息的 c# 系统。 每个信息都存储在以下数据结构中:

public struct Tag
{
   DateTime Time {get;set;}
   double Value {get;set;}
}

我们实际上可以将这些标签数组视为 Matlab 向量:

标签数组:

Time  |  Value
...   |  ...
...   |  ...
...   |  ...

好的,所以我想要为用户提供一个非常简单的 UI,他可以在这些标签上编写操作和表达式。我想出的最好方法是让用户在这些标签上编写 Matlab 表达式(这样用户几乎可以用这些向量做任何事情,他不需要学习一门新语言,而且性能将要非常快 - 我忘了提,我的标签数组真的很大)

例如:

假设我们有一个 tempratureTagArray 和一个 windTagArray 存储在当前运行中。 (其中每一个都是具有周日和周一之间分钟值的数组)。

所以我希望用户写如下内容:

x = windTagArray;
y = tempratureTagArray;

然后,一个matlab表达式:

if (x > y)
    result = x.^y + y./7 * 12;
else
    result = exp(x) + y.^6 - 7 + (x.*y).^3 + log(y);
end

我将负责在我的 c# 程序中定义向量(x 和 y)的部分,然后我将由此创建一个 matlab .m 文件。 我需要的是一种在 matlab 上启动这些 .m 文件并在我的 c# 运行时中从这些 .m 文件中获取结果向量的简单方法。 在我看来,这似乎是处理此类问题的最简单方法(我也想知道这种方法是否足够快)

那么,有没有人对实现这样的操作有什么建议?

我考虑过启动一个后台 Matlab 程序实例,并且对于每个请求,以某种方式在 Matlab 实例上“模拟”用户操作,然后以某种方式读取结果。但我不确定这是最好的方法。我想知道是否有人必须处理这种情况。

非常感谢。

编辑: 我也很高兴听到您对此类操作的运行时间的看法。这个东西将在一个带有 matlab 的服务器上运行,它会收到很多这样的请求。我实际上考虑过 Matlab,因为我知道当您使用它的本机应用程序时它运行得非常快(当然它支持大量数学运算)

【问题讨论】:

    标签: c# .net matlab time-series


    【解决方案1】:

    我遇到了类似的情况,我想出了以下解决方案。显然这不是唯一的解决方案,但它对我有用。

    1. 将变量写入可以从 Matlab 读取的二进制/文本文件。
    2. 在您的 c# 代码中将 Matlab 代码生成为字符串。它当然应该是一个有效的 Matlab 表达式,但字符串中没有换行符。使用,; 分隔命令。代码应包括从二进制/文本文件中读取变量。
    3. try-catch 包装您的代码,这样如果发生错误,您的调用就不会挂起。附加 exit 命令以关闭 Matlab。
    4. Matlab 命令应将结果的save 包含到一个二进制/文本文件中,您可以从 c# 中读取该文件。
    5. 您应该从您的代码中发出对 Matlab 的调用(类似于使用 Matlab 中的system 命令),使用使您能够发出字符串作为输入的-r 选项(例如,参见here
    6. 在您的 c# 代码中,使用 while 等待生成结果文件。使用一些最大的等待时间来避免无限while。结果文件生成后,从保存的文件中读取结果。

    【讨论】:

    • 嗨。感谢您的回答。你知道这东西的工作速度有多快吗?我会因为没有使用本机 Matlab 应用程序而只从外部调用 Matlab 函数而浪费时间吗?我问是因为我每天都要用巨大的向量执行很多这样的操作
    • 我不确定我的方法是否能很好地扩展,因为每次调用 matlab -r 就像执行 matlab,所以加载需要几秒钟。如果您有很多呼叫,则此开销可能会太大。
    • 也许使用套接字是一个更好的解决方案(我对此知之甚少)
    【解决方案2】:

    请尝试以下示例:

    example 1

    example 2

    example 3

    知道你对计算感兴趣或者你也想生成m文件也很重要。

    【讨论】:

    • 嗨。非常感谢您的回答。我实际上只对执行 .m 文件感兴趣(.m 文件的创建不是一个复杂的问题)并在我的 c# 程序中得到结果。
    猜你喜欢
    • 2013-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    相关资源
    最近更新 更多