在 C# 中计算 Matlab .m 文件
Calculating Matlab .m file in c#
我有一个 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 程序实例,对于每个请求,以某种方式 "mock" 用户在 Matlab 实例上进行操作,然后以某种方式读取结果。但我不确定这是最好的方法。我想知道是否有人必须处理这种情况。
非常感谢。
编辑:
我也很高兴听到您对 运行 此类操作时间的看法。这个东西将在带有 matlab 的服务器上 运行 ,这将收到很多这样的请求。我实际上想到了 Matlab,因为我知道当你使用它的本地应用程序时它工作得非常快(当然它支持很多数学运算)
请尝试按照以下示例操作:
example 2
了解您对计算感兴趣或者您也想生成 m 文件也很重要。
我遇到了类似的情况,并提出了以下解决方案。显然这不是唯一的解决方案,但它对我有用。
- 将变量写入您可以从 Matlab 读取的 binary/text 文件。
- 在您的 C# 代码中将 Matlab 代码生成为字符串。它当然应该是一个有效的 Matlab 表达式,但字符串中没有换行符。使用
,
或 ;
分隔命令。代码应包括从 binary/text 文件中读取变量。
- 用
try-catch
包裹您的代码,这样您的调用就不会在发生错误时挂起。附加 exit
命令以关闭 Matlab。
- Matlab 命令应将结果的
save
包含到 binary/text 文件中,您可以从 c# 中读取该文件。
- 从您的代码中,您应该发出对 Matlab 的调用(类似于使用来自 Matlab 的
system
命令),使用 -r
选项,使您能够发出字符串作为输入(例如,参见 here)
- 在您的 c# 代码中,使用
while
等待生成结果文件。使用一些最大等待时间来避免无限 while
。生成结果文件后,从保存的文件中读取结果。
我有一个 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 程序实例,对于每个请求,以某种方式 "mock" 用户在 Matlab 实例上进行操作,然后以某种方式读取结果。但我不确定这是最好的方法。我想知道是否有人必须处理这种情况。
非常感谢。
编辑: 我也很高兴听到您对 运行 此类操作时间的看法。这个东西将在带有 matlab 的服务器上 运行 ,这将收到很多这样的请求。我实际上想到了 Matlab,因为我知道当你使用它的本地应用程序时它工作得非常快(当然它支持很多数学运算)
请尝试按照以下示例操作:
example 2
了解您对计算感兴趣或者您也想生成 m 文件也很重要。
我遇到了类似的情况,并提出了以下解决方案。显然这不是唯一的解决方案,但它对我有用。
- 将变量写入您可以从 Matlab 读取的 binary/text 文件。
- 在您的 C# 代码中将 Matlab 代码生成为字符串。它当然应该是一个有效的 Matlab 表达式,但字符串中没有换行符。使用
,
或;
分隔命令。代码应包括从 binary/text 文件中读取变量。 - 用
try-catch
包裹您的代码,这样您的调用就不会在发生错误时挂起。附加exit
命令以关闭 Matlab。 - Matlab 命令应将结果的
save
包含到 binary/text 文件中,您可以从 c# 中读取该文件。 - 从您的代码中,您应该发出对 Matlab 的调用(类似于使用来自 Matlab 的
system
命令),使用-r
选项,使您能够发出字符串作为输入(例如,参见 here) - 在您的 c# 代码中,使用
while
等待生成结果文件。使用一些最大等待时间来避免无限while
。生成结果文件后,从保存的文件中读取结果。