2026a

# 编程


# 控制流

# 条件控制——switch

M 语言

当您希望针对一组已知值测试相等性时,请使用 switch 语句。例如:

date = 728647;
[dayNum, dayString] = weekday(date, 'long', 'en_US'); 
switch dayString 
case 'Monday' 
disp('Start of the work week') 
case 'Tuesday' 
disp('Day 2') 
case 'Wednesday' 
disp('Day 3') 
case 'Thursday' 
disp('Day 4') 
case 'Friday' 
disp('Last day of the work week') 
otherwise 
disp('Weekend!') 
end
Start of the work week

Julia 语言

在 Syslab 中并没有 switch 语句,但 if – elseif – else – end 语句足以替代该功能。

using TyBase
date=728647;
dayNum, dayString = weekday(date, "long", "en_US"); 
if dayString == "Monday" 
print("Start of the work week") 
elseif  dayString  == "Tuesday" 
print("Day 2") 
elseif dayString == "Wednesday" 
print("Day 3") 
elseif dayString == "Thursday" 
print("Day 4") 
elseif dayString == "Friday" 
print("Last day of the work week") 
else 
print("Weekend!") 
end
Start of the work week

对于 if ,Syslab 执行与第一个 true 条件相对应的代码,然后退出该代码块。每个条件语句都需要 end 关键字。

# 条件语句中的数组比较

M 语言

if A == B, ...

这是有效的 MATLAB 代码,并且当 A 和 B 为标量时,此代码会如期运行。但是,当 A 和 B 为矩阵时, 用 A == B 不会测试二者是否相等,而会测试二者相等的位置;结果会生成另一个由 0 和 1 构成的矩阵,并显示元素与元素的相等性。

A = magic(4); 
B = A; 
B(1,1) = 0; 
A == B
ans = 4×4 logical 数组
0 1 1 1 
1 1 1 1 
1 1 1 1 
1 1 1 1

检查两个变量之间的相等性的正确方法是使用 isequal 函数:

if isequal(A, B), ...

isequal 返回 1(表示 true)或 0(表示 false)的标量逻辑值,而不会返回矩阵,因此能被用于 if 函数 计算表达式。通过使用上面的 A 和 B 矩阵,您可以获得:

isequal(A,B)
ans = 
 logical

0

Julia 语言

如果您希望检查两个变量之间的相等性,您可以使用

if A == B 或 if A === B

由于 Syslab 容器有明确类型,数据也有明确的数据类型,在使用 == 符号时会检查输入数据的容器、数据类型以及数据一致性。如果要对比所有数据一致性,需要使用 (.) 符号进行向量化计算。

using TyMath
A = magic(4)
B = copy(A)
B[1,1] = 0
A .== B
4×4 BitMatrix:
 0  1  1  1
 1  1  1  1
 1  1  1  1
 1  1  1  1

比较 A 和 B 整体是否相等。

A == B
false

有几个函数对减少标量条件的矩阵比较结果以便用于 if 非常有用,这些函数包括: isequal、isempty、all、any。

# 循环控制——return

M 语言

return 终止当前命令序列,并将控制权返回给调用函数或键盘。此外,return 还用于终止 keyboard 模式。被调函数通常在到达函数末尾时将控制权转交给调用它的函数。您可以在被调函数中插入一个 return 语句,以便强制提前终止并将控制权转交给调用函数。

Julia 语言

在 Syslab 中 return 通常被使用在函数中,终止函数继续往下执行,并根据 return 后的参数进行函数返回。

function example_return()
    x = 0.5
    return sin(x),cos(x),tan(x)
end
example_return()
(0.479425538604203, 0.8775825618903728, 0.5463024898437905)

将有元组形式返回多输出的结果。

# 向量化

M 语言

M 语言中许多函数输入为数组时,函数内部会自动向量化,即针对数组中每个元素进行计算。

A = [1 2 3 4;5 6 7 8;9 10 11 12;13 14 15 16];
sqrt(A)
ans =

    1.0000    1.4142    1.7321    2.0000
    2.2361    2.4495    2.6458    2.8284
    3.0000    3.1623    3.3166    3.4641
    3.6056    3.7417    3.8730    4.0000

自定义的函数要实现向量化,需要在函数内部构造显式循环。

Julia 语言

Syslab 中允许您使用函数 (.) 或 (@.) 宏对函数或运算符进行逐元素操作。这种写法避免的编写显式循环。

以 sqrt 函数为例,当输入为方阵 A 时,sqrt(A) 返回 A 的矩阵平方根。

A = [1 2 3 4;5 6 7 8;9 10 11 12;13 14 15 16]
4×4 Matrix{Int64}:
  1   2   3   4
  5   6   7   8
  9  10  11  12
 13  14  15  16
sqrt(A)
4×4 Matrix{ComplexF64}:
 0.398861+0.941952im  0.451674+0.482988im  0.504487+0.0240236im   0.557299-0.434941im
 0.921555+0.36692im    1.04358+0.188139im    1.1656+0.00935797im   1.28762-0.169423im
  1.44425-0.208112im   1.63548-0.10671im    1.82671-0.00530771im   2.01795+0.0960946im
  1.96694-0.783145im   2.22739-0.401559im   2.48783-0.0199734im    2.74827+0.361612im

使用 sqrt. 方式计算矩阵 A 中每个数的平方根。

sqrt.(A)
4×4 Matrix{Float64}:
 1.0      1.41421  1.73205  2.0
 2.23607  2.44949  2.64575  2.82843
 3.0      3.16228  3.31662  3.4641
 3.60555  3.74166  3.87298  4.0

# 函数

# 函数定义

# 非匿名函数

M 语言

在 M 语言中,函数的第一行以关键字 function 开头。它提供函数名称和参量顺序。

function r = rank(A,tol)
    s = svd(A);
    if nargin==1
        tol = max(size(A)') * max(s) * eps;
    end
    r = sum(s > tol);

可以采用多种不同 方法使用 rank 函数:

rank(A) ;
r = rank(A) ;
r = rank(A,1.e-6);

函数体中提供了两个名为 nargin 和 nargout 的数量,用于告知与函数的每次特定使用相关的输入和输出参量的数目。rank 函数使用 nargin,而不需要使用 nargout。

Julia 语言

在 Julia 中,使用 function 函数名 () 的方式定义函数,括号内指定形参、关键字参数,return 指定输出参量。同时形参和关键字参数可以指定默认值,形参又名位置参数,顾名思义在调用函数时根据参数位置传入值,所以形参在设置默认值时要求有默认值的形参在靠后的位置。用分号 (;) 将关键字参数和形参分开。

function my_function(x,y,z= 0.5;key1 = 0.75,key2 = 1.25)
    return sin(x),cos(y),tan(z),key1 + key2
end
my_function (generic function with 2 methods)

# 匿名函数

M 语言

根据表达式创建匿名函数的语法为:

f = @(arglist)expression

sqr = @(x) x.^2;

要执行 sqr 函数,请键入

a = sqr(5)
a=
  25

Julia 语言

Julia 允许定义匿名函数,以方便在函数内或函数调用中传入 Function 类型变量。通常使用 (->) 符号定义匿名函数。

下面的语句创建一个求某个数字的平方的匿名函数。

sqr = x -> x .^ 2;
a = sqr(5)
25

通常在调用某个支持传入函数的函数构造匿名函数。

A = [1,2,3,4,5]
findall(x -> x > 2,A)
3-element Vector{Int64}:
 3
 4
 5

# 函数调用与输出

M 语言

在 M 语言中,函数参数分为形参和关键字参数。形参根据位置逐个传入变量,键值对则是需要根据函数内部定义规则按照 key = value 的逻辑传入,或直接显示 key = value 方式传入。

Julia 语言

在 Julia 语言中,根据函数定义中的形参和关键字参数,其调用方法也不相同。形参根据位置逐个传入变量,关键字参数需要使用关键字参数名 = 变量的方式传入。

function my_function(x,y,z= 0.5;key1 = 0.75,key2 = 1.25)
    return sin(x),cos(y),tan(z),key1 + key2
end
my_function(1,2,3,key1 = 4,key2 = 5)
(0.8414709848078965, -0.4161468365471424, -0.1425465430742778, 9)

Julia 函数不支持 nargout 选项,这从函数定义就能看出,即不能根据输出参数个数指定输出情况,所以推荐顶层接口函数全输出,底层算法函数根据不同算法按需输出。多输出函数会将输出放在一个元组里,调用函数时将输出变量用 (,) 分隔即可逐个赋值。

res1,res2,res3,res4 = my_function(1,2,3,key1 = 4,key2 = 5)
res1 = 0.8414709848078965

res2 = -0.4161468365471424

res3 = -0.1425465430742778

res4 = 9

# 函数式编程

M 语言

M 语言中,只有特定的函数支持函数作为参数传递,大部分功能来源于向量化计算组合。

A = [2,4,6,8,10]
A =

     2     4     6     8    10

判断是否全为偶数。

tfeven = ~mod(A,2);
all(tfeven)
ans =

  logical

   1

Julia 语言

Julia 中有很多函数支持传入函数作为参数,利用函数传递的方式避免向量化计算和临时变量的创建,提高运算效率和代码可读性。

使用 all 函数判断向量 A 中函数是否全为偶数

A = [2,4,6,8,10]
5-element Vector{Int64}:
  2
  4
  6
  8
 10

先利用 iseven 和 (.) 计算每个元素是否为偶数得到变量 tfeven,再将 tfeven 传入 all 函数得到结果。

tfeven = iseven.(A)
5-element BitVector:
 1
 1
 1
 1
 1
all(tfeven)
true

使用 all 函数的函数参数传递接口计算。

all(iseven,A)
true

# 文件管理

M 语言

MATLAB 在特定位置中查找脚本及其他文件。要运行脚本,该文件必须位于当前文件夹或搜索路径中的某个文件夹内。

默认情况下,MATLAB 安装程序创建的 MATLAB 文件夹位于此搜索路径中。如果要将程序存储在其他文件夹,或者要运行其他文件夹中的程序,请将其添加到此搜索路径。在“文件”面板中选中相应的文件夹,右键点击它,然后选择添加到路径。

Julia 语言

在撰写算法函数或脚本时,通常会用不同的文件撰写不同的功能,在 Syslab 中并不是以当前文件夹作为管理路径所有文件中函数自动导出,通常需要在所需文件中将被用到的文件使用 include 函数加载。

使用 include 加载其他文件中的函数并计算。在 A 文件中撰写函数 func_A 用于计算函数正弦值:

# A文件
function func_A(x)
    return sin(x)
end

在 B 文件中导入文件。如果在同一文件夹下,可以直接使用 include ("文件名")这种相对路径方式导入,也可以使用绝对路径。

include("A.jl")
func_A(10.5)
-0.87969575997167

# 类型系统

在 M 语言中,所有变量本质上是数组(Matrix Laboratory),即使是标量,其实也是一个 1x1 矩阵,默认类型是 double precision 浮点数(double)。MATLAB 有类型(double, single, int32, char, logical, cell, struct, table 等)

在 Julia 语言中,类型是很重要的概念。Julia 中的每一个变量在创建时都被赋予明确的类型,不同的类型对数值、容器等类型的表示形式、数据特征都不相同,类型是显式参与运算与调度的。

# 变量创建

M 语言中,变量创建时默认为 double 类型数组。

a=-1
class(a) 
ans = 

     'double'

a 的维度为 1 × 1。

size(a) 
ans =

     1     1

# 类型强制转换

M 语言

将 4.0 强制转换为 4。

int64(4.0)
ans =

  int64

   4

将 4.5 强制转换转为 4 。

int64(4.5)
ans =

  int64

   5

Julia 语言

在 Julia 中,允许使用类型作为函数对目标进行类型强制转换。如将 4.0 强制转换为 4 。

Int(4.0)
4

但类型强制转换要求输入本身符合目标类型要求,比如 Int(4.5) 会抛出错误,因为 Julia 并不会对 4.5 执行取整操作。

数组之间通常不能强制转换,请谨慎使用。

# 注释

M 语言

在 M 语言中,使用 (%) 符号单行注释。

% Syslab
% Good

Julia 语言

Julia 语言中,单行注释使用 (#) 符号,多行注释使用 (#= =#) 符号

# Syslab Good

#=
Syslab
Good
=#