LabVIEW MathScript 的已知问题和局限
主要软件:
主要软件版本: 8.0
主要软件修正版本: N/A
次要软件: LabVIEW Development Systems>>LabVIEW Full Development System
问题: MathScript是LabVIEW 8.0的新特性之一,其强大而令人兴奋的特性、功能性并非完全兼容Matlab函数。这篇文档列举了一些限制和LabVIEW 8 MathScript所知的您必须注意的问题。这个列举也并非全面的。这将提示您注意一些关键的问题和如何改进您的代码。我们将为改进LabVIEW and MathScript而努力。补丁和(或)更高版本的LabVIEW将修复或改善这篇文档所述的问题和限制。
解答: - MathScript不支持扩展ASCII字符和本地化的小数点分隔:
这个问题只影响:- 英文版LabVIEW 8在非英文,本地化版本的Windows上运行。
这个问题不影响:- 英文版LabVIEW 8在英文版Windows上运行
- 本地化的(非英文)LabVIEW 8运行在非英文、本地化的Windows上
如果您想创建一个含重音(比如法语中的ChaîneDeux)的变量名或一个字符串,MathScript将返回错误“The current MathScript could not be executed. Please contact National Instruments with the script.”另外,LabVIEW不能安装在用户名包括外文字符或者文件夹完整路径中包含重音字符或者MathScript不接受的字符。
本地化的小数点分隔问题是MathScript只认可句点为小数分隔点。然而,MathScript是建立在LabVIEW之上的。因为LabVIEW中的小数分隔点和系统指定的一致,这是导致MathScript问题的原因。举个例子:
x = -1:0.1:1;
导致的错误信息是:“You cannot specify a step size of zero for a range.”
解决本地化的小数分隔点的方法包括:
- 改变系统区域为英文(或至少改为句点为小数点)。这个副作用是所有的应用程序都将使用新的设置。
- 改变LabVIEW设置为系统指定的小数分隔点。可通过更改LabVIEW菜单中Tools>>Options中的设置完成。点击前面板并且不选中“Use localized decimal point”选项。这个副作用是这样做将使所有LabVIEW VI受到影响。
- LabVIEW 8 MathScript目前并不支持LabVIEW应用程序生成器(LabVIEW Application Builder):在创建好基于VI的程序,可能希望创建一个可独立执行或DLL来发布程序。如果您的程序中的任何VI使用到MathScript节点,目前,还不能利用LabVIEW应用程序生成器将其编译成可执行程序。很不幸,这并没有产生错误也没有解决方法。所以,在目前,请不要将MathScript节点加到您将要编译的LabVIEW应用程序中去。
- LabVIEW 8 MathScript不支持MEX文件(可执行的m文件脚本),稀疏矩阵,大于2维的数组,单元数组或结构: 一个单元数组的例子是:
A = {magic(3) 6.9 'string'};
用一个结构的例子:
a.day = 12;
- 在MathScript中用户定义的函数名是大小写敏感的:当您试图调用一个函数
foo
,定义在 foo.m
中,您必须键入
foo(x)
一些m文件脚本是大小写敏感并调用函数如下
FoO(x)
将不能工作。所有内置的函数已经是大小写敏感了。
- 用户不能指定用户自定义的函数中可选参数的缺省值: 典型地,可通过第三方的数学软件中
nargin
函数调用来确定提供了哪些输入参数,并赋值给缺少的参数。目前,并不支持nargin
和nargout
。去调用使用缺省值的函数,您必须去除调用nargin
和nargout
并始终提供所有的参数。因为目前没有办法去判定有多少输出参数是必需的,所以您应该计算所有的输出参数。
- LabVIEW 8 MathScript不支持'return'和 'end'关键字:用在第三方数学软件中的
return
关键字是不支持的,end
关键字在矩阵脚标指定中也是不支持的。return
关键字用来中断执行,并从在所定义的函数末尾之前的一个函数返回。一个LabVIEW 8 MathScript所不支持的一个用法是
function c = foo(a, b)
if a == 2
return;
end
c = 5;
一个解决方法是使用一个标记变量。替换return
的声明,设置这个标记变量为一特定值。放在核实标记变量值的if声明中原来return
声明的后面。
LabVIEW 8 MathScript在矩阵脚标指定中使用end
关键字有问题的例子包括
B = A(2:end)
B = C(2:end, 4)
解决第一个例子的方法取决于A
是一维还是两维的。如果是一维的,你可以使用length
函数,替换成:
B = A(2:length(A))
如果是两维的,您可以确定矩阵的大小,并计算元素的总个数:
[m n] = size(A)
B = A(2:m*n)
如果两个脚标像第二个例子那样指定,同样判定矩阵的大小函数:
[m n] = size(C)
B = C(2:m, 4)
- MathScript节点不能直接放在LabVIEW仿真模块的仿真程序框图中:目前,MathScript节点不能直接放在仿真程序框图中。一个解决方案是,在仿真程序框图中创建一个子VI,包括MathScript节点和所需的输入输出。把这个子VI放入仿真程序框图即可。
- 如果矩阵上用一个线性的脚标,输出返回的或通过计算返回的和脚标指定的一样:例如,下面的例子将得到所有奇数脚标的元素:
A = rand(1000);
B = A(1:2:1000000);
这个例子涉及一个矩阵的重新整合,这会占用很大的资源而影响性能。您可以把矩阵回到LabVIEW(通过MathScript节点输出变量)来改善性能,在程序框图中实现脚标运算。一般的,通过脚标指定矩阵元素将使系统性能下降。如果可能,实现整个矩阵的运算,而非某个单独的行、列或者元素。
- 多个函数的输出不能是某个矩阵的一个元素:举个例子,如果函数
foo
返回两个值,任何一个输出都不能直接放进某个矩阵的子元素。否则,将返回错误信息:“The current MathScript could not be executed. Please contact National Instruments with the script.”在LabVIEW 8 MathScript中不能工作的一个例子是
[vs(m, n) s] = foo(...)
解决方法是通过两步实现:
[a s] = foo(...)
vs(m, n) = a
- MathScript不能在两个应用程序间共享全局变量:如果您已经创建了两个独立的都包含MathScript节点的工程项目,并想通过MathScript全局变量来实现通信,在各自项目中的节点将看不到另一个工程项目的全局变量。目前,MathScript环境只局限于一个应用程序。解决方法是把MathScript节点中的变量返回并写入共享变量。您可以在另一个工程项目读取这个共享变量。另外,在任何应用程序中,只能运行一个MathScript窗口。
- 在MathScript节点外的循环中存储变量信息将带来计算量增加:当您在LabVIEW中完成运算后,您可以选择图形(LabVIEW代码),文本(LabVIEW MathScript),或者图形和文本的综合。您可以基于个人偏好或出于改进代码的可视性选择处理方法。选择不同的方法同样会影响程序执行性能。比如,如下图所示,您可以去除MathScript node外的for循环。图示程序会降低代码性能,并因为一些变量状态在循环中反复保存而带来资源占用。而这些资源的占用是可以没有必要的,可以在MathScript节点中增加循环语句,这样做会更有效。
- 如果日期格式和美国的不一致,日历函数也将不能正常应用: 在世界其他地方,一个通用的日期格式是首先返回日,(例如,17/10/2005)。这将导致日期函数返回错误描述“A problem occurred in a subVI call.”一个解决的方法是改变您所在区域的时间格式。
相关链接: LabVIEW 8.0 Help: LabVIEW MathScript
附件:
报告日期: 05/11/2006
最近更新: 05/19/2006
文档编号: 3TQCP6HV
Other Support Options
Ask the NI Community
Collaborate with other users in our discussion forums
Request Support from an Engineer
A valid service agreement may be required, and support options vary by country.