scilab中文帮助手册
本文转自:Scilab 中文教育推廣 http://groups.google.com/group/ade-scilab .......
(1) 程序设计programming:
abort: 中断计算
说明:abort命令中断当前计算并给出Scilab的提示符(“-->”)。如果用户使用pause命令进入高层界面,可使用abort命令回到初始层界面,出现Scilab的提示符(“-->”)。
Ans: 计算结果
说明:如果表达式的值没有被赋与任何变量,那么Scilab自动产生一个变量Ans,用来存储当前表达式的值。
backslash (/):矩阵左除
调用格式:如x=A/b
说明:backslash (/)代表矩阵左除,x=A/b是方程A*x=b的解。
如果A是一个方阵或者可逆矩阵(nonsingular或者invertible),那么x=A/b是方程A*x=b的唯一确定的解,且等于x=inv(A)*b.
(通俗的说,就是方程数目等于未知数个数,所以解唯一。如A=[1 2 1;3 2 2;2 3 1],b=[8;13;11])
如果A不是一个方阵,那么x是最小二乘解,此时,该解x使norm(A*x-b)最小。
(通俗的说,就是方程数目不等于未知数个数。
如果方程数目大于未知数个数,本来是没有准确解的,但可以根据最小二乘法原理拟合出最佳解。如A=rand(3,2);b=[1;1;1]。此时,由于A不是一个方阵,无法使用inv(A)命令,因此x=A/b等效于x=pinv(A)*b.
如果方程数目小于未知数个数,应该有无穷个解,用x=A/b命令得出的解只是其中的一个解,而用pinv(A)*b命令得出的解则比较粗糙,没有用x=A/b命令得出的解精确。)
如果A是一个列满秩矩阵(矩阵的秩等于列数),那么此最小二乘解x=A/b是唯一能使norm(A*x-b)最小的解。
如果A不是一个列满秩矩阵,那么此最小二乘解x=A/b不能使norm(A*x-b)最小,使norm(A*x-b)最小的解应该是x=pinv(A)*b)。
inv(A)要求A是方阵,pinv(A)则不要求A是方阵
bool2s :将布尔矩阵转化为0、1矩阵
调用格式:bool2s(x)
参数:x是一个布尔向量或者布尔矩阵或者常数矩阵。
说明:如果x是一个布尔矩阵,bool2s(x)返回一个0、1矩阵,1代表真,0代表假。如果x是一个普通矩阵,bool2s(x)也返回一个0、1矩阵,1代表非0的数字。
boolean:它表示Scilab对象或者布尔型变量和操作符 与或非& | ~
说明:布尔型变量为%T(代表真)%F (代表假)。这些变量可以用来定义矩阵。布尔型型矩阵可以像普通矩阵操作,如元素的抽取、插入与连接,但不能进行如( +, *, -, ^, )等运算,布尔型型矩阵有三个特殊的操作符号:与或非& | ~
brackets括号:包括左右圆括号(),左右方括号[].
方括号调用格式:[a11,a12,...;a21,a22,...;...]
圆括号调用格式: [s1,s2,...]=func(...)
参数a11,a12,... : 任何合适的矩阵 (实数, 多项式, 有理数等);
参数s1,s2,... : 任何变量名;
说明:[ ]用于向量定义或者矩阵连接或者用在调用函数的左边存储变量,而()用于函数调用。[ ]在用于矩阵连接时,空格、逗号用来隔开每“行”中的元素,分号、回车则用来隔开各“行”。[ ] 用在调用函数的左边存储变量时,必须用逗号隔开个变量。
break -结束循环
说明:在for 或者 while 循环中,break命令强制结束循环
试试看k=0; while 1==1, k=k+1; if k > 100 then break, end; end
call-Fortran or C 用户程序调入
调用格式有两种
长型 [y1,...,yk]=call("ident",x1,px1,"tx1",...,xn,pxn,"txn","out",[ny1,my1],py1,"ty1",...,[nyl,myl],pyl,"tyl")
短型 [y1,....,yk]=call("ident",x1...,xn)
参数说明:
ident:字符串,代表所要调用的子程序的名字。
Xi:实数矩阵或者字符串,代表输入变量
pxi,pyi:整数,代表各输入变量在调入ident程序时的相对位置
txi,tyi:字符”d””r” “c” “i”,代表输入变量的数据类型,d代表双精度型,r代表实型(浮点型),c代表字符型,I代表整型。
Out:关键词,用来格开输入变量于输出变量。当有Out时,表明是长型调入,而没有Out是短型调入.
[ny1, my1]是输出变量的大小
功能说明:call命令用于在scilab于调入Fortran or C 用户程序,所要调入的程序应该预先与scilab链接,链接的方法如下:
1.软链接:在scilab进程中使用命令link链接
2.硬链接:先用scilab下已有的程序(default/Ex-fort.f)作为调入程序,再在文件(default/Flist)中增加一个入口,然后再使用命令make bin/scilex与scilab连接.
call语句有两种调用形式,长型与短型.短型调用语法简单,能够很快地编译代码,但必须写一个小小的C或者F接口程序.长型调用则不需要,但语法复杂,代码解释速度也比较慢.
例子:C语言
//简单的C语言
f1=['#include <math.h>'
'void fooc(c,a,b,m,n)'
'double a[],*b,c[];'
'int *m,*n;'
'{'
' int i;'
' for ( i =0 ; i < (*m)*(*n) ; i++) '
' c[i] = sin(a[i]) + *b; '
'}'];//定义一个字符串矩阵,9行1列
mputl(f1,'fooc.c')
//将字符串矩阵f1写成一个ascii文件fooc.c
ilib_for_link('fooc','fooc.o',[],"c")
//创建一个共享库(含gateway, Makefile 和loader)
exec loader.sce
// 载入共享库
a=[1,2,3;4,5,6];b= %pi;[m,n]=size(a);
//变量初赋值
// 输入变量
// a is in position 2 and double
// b 3 double
// n 4 integer
// m 5 integer
// 输出变量
// c is in position 1 and double with size [m,n]
c=call("fooc",a,2,"d",b,3,"d",m,4,"i",n,5,"i","out",[m,n],1,"d");
注意:运行以上程序,无论是在window下还是在linux下都会出错,在语句ilib_for_link('fooc','fooc.o',[],"c")处出错.
case-判断语句的关键词
说明:用在选择语句select...case中的关键词:
用法如下:
select 表达式0
case 表达式1 then 程序1,
case 表达式2 then 程序2,
...
case 表达式3 then 程序3,
[else 程序],
end
例子:
while %t do
n=round(10*rand(1,1)) //产生一个随机数n,
select n
case 0 then //如果该随机数为0,则显示0
disp(0)
case 1 then
disp(1) //如果该随机数为1,则显示1
else
break //如果该随机数为其他值,则中断程序
end
end
clearglobal - 清除全局变量
调用格式:
clearglobal() 该命令清除所有全局变量
clearglobal nam1 .. namn 该命令清除指定全局变量
clearglobal('nam1', ..,'namn') 该命令清除指定全局变量
其中nam1 .. namn为有效的全局变量
例子:
global a b c
a=1;b=2;c=3;
who('global')
clearglobal b
who('global')
clear -清除变量
调用格式 clear a
说明:
这个命令用来清除不受保护的变量.clear a清除指定变量a,而clear 清楚所有不受predef保护的变量.
正常情况下,受保护的变量是指标准库程序和带有百分号的变量,如%pi,%t等.
注意语法格式.是clear a而不是clear(a).也要注意a=[]并没有清楚a,而是把a置空.
colon - (:) 冒号操作符
说明:
该操作符可以用来生成implicit vectors(不好翻译,看下面的例子就明白了)
j:k生成一个向量[j, j+1,...,k](如果j>k则为空集).
j:d:k生成一个向量[j, j+d, ..., j+m*d].
该操作符可以用来挑选向量或者矩阵中的某一行,某一列或者某一个元素
A(:) 是指A中的元素按从左到右从上到下的顺序排成的一列.
A(:,j) 是指A中的第j列元素.
A(j:k) 是指[A(j),A(j+1),...,A(k)]
A(:,j:k) 是指[A(:,j),A(:,j+1),...,A(:,k)]
A(:)=w 是指用w将矩阵A填满.
comma - (,) 列,指令与参数分隔符
说明:
该操作符用来分隔函数中的参数,或者用来分隔单行矩阵中的列,
空格也可以用来分隔单行矩阵中的列,但用逗号更加合适.另外也可以用来
分隔指令,分号;也可以用来分隔指令,但不会将结果显示在屏幕上.
例子:
a=[1,2,3;4,5,6];
a=1,b=1;c=2
comments -注释
注释行以//开始,它不会为scilab所编译
continue -控制语句中的关键词,使程序转向下一个循环.
说明:
在for和while循环中,命令continue使程序转向下一个循环,而忽略该次循环中continue语句和end语句之间的指令.
例子1:
for k=1:10,K=k;if k>2&k<=8 then continue,disp('hello'),end,k,end
例子2:
for j=1:2
x=[];
for k=1:10,if k>j+1&k<=8 then continue,end,x=[x,k];end
x
end
Date – 显示当前时间命令
调用格式:date或者 date() 或者 date () 或者dt=date()
说明:dt=date()返回一个以格式dd-mmm-yyyy 表明时间的字符串。
debug – 调试级别
调用格式:debug(level-int) 或者level-int=debug()
参数:level-int代表一个0-4的整数。
说明:对于不同的整数,代表了不同的调试级别。
definedfields – 返回列表变量中已定义元素的索引
调用格式:k=definedfields(l)
参数:l是一个列表变量(可以是list , tlist或者mlist类型),k