这是 PDL::MATLABp 命令,可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器
程序:
您的姓名
PDL::MATLAB - MATLAB 用户指南。
引言
如果您是 MATLAB 用户,则此页面适合您。 它解释了之间的主要区别
MATLAB 和 PDL 可帮助您尽快开始工作。
本篇 文件 is 而不去 a 教程. 为此,请转到 PDL::QuickStart。 这个文件
补品 快速入门指南,因为它突出了 MATLAB 和
PDL。
Perl的
MATLAB 和 PDL 之间的主要区别是 Perl的.
Perl 是一种通用编程语言,拥有数千个免费模块
在网上。 PDL 是 Perl 的扩展。 这使 PDL 程序可以访问更多功能
比大多数数字工具做梦都好。 同时,大多数语法差异
MATLAB 和 PDL 是其 Perl 基础的产物。
您 do 而不去 它们在许多情况下都能提供类似的结果。 至 学习 许多 Perl的 至 be 高效 - PDL. 但是如果你想学
Perl,有很好的在线文档(http://perldoc.perl.org>) 或
通过命令“perldoc perl”。 还有一个初学者的门户
(<http://perl-begin.org>)。
Perl 的模块存储库称为 CPAN (http://www.cpan.org>) 并且它有大量的
模块。 运行“perldoc cpan”以获取更多信息。
术语: 皮德尔
MATLAB 通常是指向量、矩阵和数组。 Perl 已经有数组,并且
术语“向量”和“矩阵”通常指的是一维和二维集合
数据。 由于没有好的术语来描述他们的对象,PDL 开发人员创造了这个术语
"iddle" 为其数据类型命名。
A iddle 由一系列组织为 N 维数据集的数字组成。 皮德尔斯
提供大型 N 维矩阵的高效存储和快速计算。 他们是
高度优化的数值工作。
有关更多信息,请参阅“皮德尔斯 vs Perl的 阵列"在本文档后面。
指挥 窗口 AND IDE
与 MATLAB 不同,PDL 不附带专用的 IDE。 然而,它确实带有
交互式 shell,您可以使用 Perl IDE 来开发 PDL 程序。
PDL 互动 壳
要启动交互式 shell,请打开终端并运行“perldl”或“pdl2”。 就像在 MATLAB 中一样,
交互式 shell 是学习语言的最佳方式。 要退出外壳,请键入
“退出”,就像 MATLAB 一样。
撰稿 PDL 程式
一种流行的 Perl IDE 称为 Padre(http://padre.perlide.org>)。 它是交叉的
平台且易于使用。
每当您编写独立的 PDL 程序时(即在“perldl”或“pdl2”外壳之外)
您必须以“use PDL;”启动程序。 此命令将 PDL 模块导入到
珀尔。 这是一个示例 PDL 程序:
使用 PDL; # 导入主PDL模块。
使用 PDL::NiceSlice; # 导入额外的 PDL 模块。
使用 PDL::AutoLoader; # 导入额外的 PDL 模块。
$b = pdl [2,3,4]; # 语句以分号结尾。
$A = pdl [[1,2,3],[4,5,6]]; # 二维矩阵。
打印 $A x $b-> 转置;
将此文件另存为“myprogram.pl”并使用以下命令运行它:
perl 我的程序.pl
新: 灵活性 句法
在当前版本的 PDL(版本 2.4.7 或更高版本)中,有一个灵活的矩阵语法
看起来与 MATLAB 极其相似:
1) 使用“;” 分隔行:
$b = pdl q[2,3,4];
$A = pdl q[ 1,2,3 ; 4,5,6];
2)使用空格分隔元素:
$b = pdl q[ 2 3 4 ];
$A = pdl q[ 1 2 3 ; 4 5 6];
基本上,只要你在左括号前面放一个“q”,PDL应该“做什么
你的意思是”。所以你可以用更适合你的语法来编写。
课程结构 用于 MATLAB USERS
MATLAB 用户需要使用两个模块:
PDL::尼斯切片
为 PDL 提供更短且更熟悉的切片(子矩阵)语法
MATLAB 用户。
%MATLAB
b(1:5) --> 从 b 中选择前 5 个元素。
# 没有 NiceSlice 的 PDL
$b->slice("0:4") --> 从 $b 中选择前 5 个元素。
# PDL 与 NiceSlice
$b(0:4) --> 从 $b 中选择前 5 个元素。
PDL::自动加载器
为 PDL 提供 MATLAB 风格的自动加载器。 如果调用了未知函数“foo()”,
PDL 查找名为“foo.pdl”的文件。 如果它找到一个,它就会读取它。
基础课程 功能
本节说明 PDL 的语法与 MATLAB 的不同之处。 大多数 MATLAB 用户都希望
从这里开始。
一般用途总体评估 “陷阱”
指数
在 PDL 中,索引从“0”(如 C 和 Java)而不是 1(如 MATLAB 或 FORTRAN)开始。 为了
例如,如果 $b 是一个有 5 个元素的数组,元素的编号将从 0 到
4.
显示对象
MATLAB 通常会自动显示对象内容。 在您显示的 PDL 壳中
使用“打印”命令或快捷方式“p”明确的对象:
MATLAB:
>> a = 12
a = 12
>> b = 23; % 抑制输出。
>>
PDL 外壳(perldl 或 pdl2):
pdl> $a = 12 # 没有输出。
pdl> print $a # 打印对象。
12
pdl> p $a # "p" 是 shell 中 "print" 的简写。
12
pdl>
创造 皮德尔斯
PDL 中的变量
变量总是以“$”符号开头。
MATLAB:值 = 42
PerlDL:$value = 42
基本语法
使用“pdl”构造函数创建一个新的 iddle.
MATLAB:v = [1,2,3,4]
PerlDL:$v = pdl [1,2,3,4]
MATLAB:A = [ 1,2,3 ; 3,4,5]
PerlDL: $A = pdl [ [1,2,3] , [3,4,5] ]
简单矩阵
软件开发语言
------ ------
矩阵 那些(5) 个 5,5
零矩阵 零(5) 零 5,5
随机矩阵 兰特(5) 随机 5,5
线性向量 1:5 序列 5
请注意,在 PDL 中,函数调用中的括号通常是可选的。 这是
重要的是要留意可能的歧义。 例如:
pdl> p 零 2, 2 + 2
这应该被解释为“zeros(2,2) + 2”还是“zeros 2, (2+2)”? 两者都是
有效陈述:
pdl> p zeros(2,2) + 2
[
[2 2]
[2 2]
]
pdl> p 零 2, (2+2)
[
[0 0]
[0 0]
[0 0]
[0 0]
]
与其试图记住 Perl 的优先顺序,不如使用
括号使您的代码明确。
线性间隔序列
MATLAB:>> linspace(2,10,5)
答案 = 2 4 6 8 10
PerlDL:pdl> p 零(5)->xlinvals(2,10)
[2 4 6 8 10]
说明:从1个元素的一维piddle开始,平均给
从 2 到 10 的间隔值。
MATLAB 对此有一个函数调用。 另一方面,PDL的方法更多的是
灵活的:
pdl> p zeros(5,5)->xlinvals(2,10)
[
[2 4 6 8 10]
[2 4 6 8 10]
[2 4 6 8 10]
[2 4 6 8 10]
[2 4 6 8 10]
]
pdl> p zeros(5,5)->ylinvals(2,10)
[
[2 2 2 2 2]
[4 4 4 4 4]
[6 6 6 6 6]
[8 8 8 8 8]
[10 10 10 10 10]
]
pdl> p zeros(3,3,3)->zlinvals(2,6)
[
[
[2 2 2]
[2 2 2]
[2 2 2]
]
[
[4 4 4]
[4 4 4]
[4 4 4]
]
[
[6 6 6]
[6 6 6]
[6 6 6]
]
]
切片和索引
从数据集合中提取子集称为 切片. PDL 和 MATLAB
有一个类似的切片语法,但有两个重要的区别:
1) PDL 索引从 0 开始,就像在 C 和 Java 中一样。 MATLAB 从 1 开始索引。
2) 在 MATLAB 中,您认为“行和列”。 在 PDL 中,考虑“x 和 y”。
MATLAB PerlDL
------ ------
>> A pdl> p $A
一个 = [
1 2 3 [1 2 3]
4 5 6 [4 5 6]
7 8 9 [7 8 9]
]
-------------------------------------------------- -----
(行 = 2,列 = 1)(x = 0,y = 1)
>> A(2,1) pdl> p $A(0,1)
答案 = [
4 [4]
]
-------------------------------------------------- -----
(行 = 2 到 3,列 = 1 到 2)(x = 0 到 1,y = 1 到 2)
>> A(2:3,1:2) pdl> p $A(0:1,1:2)
答案 = [
4 5 [4 5]
7 8 [7 8]
]
警告
当您编写独立的 PDL 程序时,您必须包含 PDL::NiceSlice
模块。 见上一节“课程结构 用于 MATLAB USERS“更多
信息。
使用 PDL; # 导入主PDL模块。
使用 PDL::NiceSlice; # 很好的切片语法。
使用 PDL::AutoLoader; # 类似 MATLAB 的自动加载器。
$A = 随机 4,4;
打印 $A(0,1);
矩阵 运营
矩阵乘法
MATLAB:A * B
PerlDL:$A x $B
逐元素乘法
MATLAB:A .* B
PerlDL:$A * $B
颠倒
MATLAB:A'
PerlDL:$A->转置
功能 这 骨料 data
某些函数(如“sum”、“max”和“min”)聚合 N 维数据集的数据。
这是 MATLAB 和 PDL 采取不同方法的地方:
在 MATLAB 中,这些函数都在一维上工作。
>> A = [ 1,5,4 ; 4,2,1 ]
一 = 1 5 4
4 2 1
>> 最大值(A)
答案 = 4 5 4
>> 最大值(A')
答案 = 5 4
如果你想要整个数据集的最大值,你可以使用特殊的 A(:)
基本上将整个数据集转换为单个一维的表示法
向量。
>> 最大(A(:))
答案 = 5
>> A = 个(2,2,2,2)
>> 最大(A(:))
答案 = 1
PDL 为每个功能提供两个功能。
总和与总和
平均与平均
最大值与最大值
最小值与最小值
- 长 姓名 在一个维度上工作,而 短 姓名 适用于整个
拨弄。
pdl> p $A = pdl [ [1,5,4] , [4,2,1] ]
[
[1 5 4]
[4 2 1]
]
pdl> p $A-> 最大值
[5 4]
pdl> p $A->transpose->maximum
[4 5 4]
pdl> p $A->max
5
pdl> p 个 (2,2,2)->max
1
pdl> p 个 (2,2,2,2)->max
1
备注 请注意,PDL 是水平聚合的,而 MATLAB 是垂直聚合的。 其他
话:
MATLAB PerlDL
max(A) == $A->transpose->maximum
max(A') == $A->最大值
小提示:在 MATLAB 中,您认为“行和列”。 在 PDL 中,考虑“x 和 y”。
更高 尺寸的 data 套
一个相关的问题是 MATLAB 和 PDL 如何理解更高维度的数据集。 MATLAB 是
专为一维向量和二维矩阵设计。 更高维的对象(“ND 阵列”)是
添加在顶部。 相比之下,PDL 从一开始就是为 N 维 piddles 设计的。 这个
导致在 MATLAB 中出现一些在 PDL 中不会出现的惊喜:
MATLAB 将向量视为二维矩阵。
MATLAB PerlDL
------ ------
>> 向量 = [1,2,3,4]; pdl> $vector = pdl [1,2,3,4]
>> size(vector) pdl> p $vector->dims
答案 = 1 4 4
MATLAB 将“[1,2,3,4]”视为二维矩阵(2x1 矩阵)。 PDL 将其视为一维向量:A
尺寸为 4 的单一维度。
但是 MATLAB 忽略了 4x1x1 矩阵的最后一个维度。
MATLAB PerlDL
------ ------
>> A = 个(4,1,1); pdl> $A = 4,1,1
>> size(A) pdl> p $A->dims
答案 = 4 1 4 1 1
MATLAB 对 4x1x1 矩阵的处理方式与 1x1x4 矩阵不同。
MATLAB PerlDL
------ ------
>> A = 个(1,1,4); pdl> $A = 1,1,4
>> size(A) pdl> p $A->dims
答案 = 1 1 4 1 1 4
MATLAB 没有用于 ND 数组的直接语法。
pdl> $A = pdl [[[1,2,3],[4,5,6]], [[2,3,4],[5,6,7]]]
pdl> p $A->dims
3 2 2
功能支持。
在 MATLAB 中,稀疏矩阵支持等多项功能不适用于 ND
数组。 在 PDL 中,几乎一维和二维 piddles 支持的任何功能都一样
由 N 维 piddles 支持。 通常没有区别。
循环 结构
Perl 有很多循环结构,但我们只展示最熟悉的一种
MATLAB 用户:
MATLAB PerlDL
------ ------
对于 i = 1:10 对于 $i (1..10) {
disp(i) 打印 $i
结束 }
备注 切勿将 for 循环用于数值计算。 Perl 的 for 循环比 MATLAB 的快,
但他们都对“矢量化”操作相形见绌。 PDL 有许多工具可以
方便编写矢量化程序。 这些超出了本指南的范围。 到
了解更多信息,请参阅:PDL::Indexing、PDL::Threading 和 PDL::PP。
同样,即使在 for 循环之外,也不要将 1..10 用于数值计算。 1..10 是一个
Perl 数组。 Perl 数组旨在提高灵活性,而不是速度。 用 提琴 代替。
要了解更多信息,请参阅下一节。
皮德尔斯 vs Perl的 阵列
重要的是要注意a之间的区别 恶作剧 和一个 Perl 数组。 Perl 有一个
可以容纳任何类型元素的通用数组对象:
@perl_array = 1..10;
@perl_array = ( 12, "你好" );
@perl_array = ( 1, 2, 3, \@another_perl_array, 序列(5));
Perl 数组允许您创建强大的数据结构(请参阅 时间 结构 以下), 但是
他们 旨在 而不去 旨在 数字的 工作. 为此,使用 提琴:
$pdl = pdl [ 1, 2, 3, 4 ];
$pdl = 序列 10_000_000;
$pdl = 600, 600;
例如:
$points = pdl 1..10_000_000 # 4.7 秒
$points = 序列 10_000_000 # 毫秒
小提示:您可以在数字中使用下划线(“10_000_000”比 10000000 读起来更好)。
条件语句
Perl 有很多条件,但我们只展示 MATLAB 最熟悉的一个
用户:
MATLAB PerlDL
------ ------
如果值 > MAX if ($value > $MAX) {
disp("太大") 打印"太大\n";
elseif 值 < MIN } elsif ($value < $MIN) {
disp("太小") 打印"太小\n";
其他 } 其他 {
disp("Perfect!") print "Perfect!\n";
结尾 }
备注 这是一个“陷阱”:
MATLAB:否则
PerlDL: elif
如果您的条件给出语法错误,请检查您是否编写了“elsif”
正确。
蒂姆托迪 (那里 Is 更多 比 一个 方法 至 Do 它)
PDL 和其他工具之间最有趣的区别之一是表现力
Perl 语言。 TIMTOWDI 或“有不止一种方法可以做到”,是 Perl 的座右铭。
Perl 是由一位语言学家编写的,它的一个定义特性是语句可以
以不同的方式表达,使语言更自然。 例如,你
不太可能对朋友说:
“虽然我没有完成,但我会继续工作。”
人类语言比这更灵活。 相反,您更有可能说:
“我会继续工作,直到我完成。”
由于其语言根源,Perl 是唯一具有此类功能的编程语言
灵活性。 例如,Perl 有传统的 while 循环和 if 语句:
而(!完成()){
继续工作();
}
如果(!妻子愤怒()){
亲吻妻子();
}
但它也提供了替代方案 直到 和 除非 声明:
直到(完成()){
继续工作();
}
除非(妻子愤怒()){
亲吻妻子();
}
Perl 允许您以“后缀”形式编写循环和条件:
保持工作()直到完成();
亲吻妻子()除非妻子愤怒();
通过这种方式,Perl 通常可以让您编写比以往更自然、更易于理解的代码
可能在更严格的编程语言中。
功能
PDL 用于声明函数的语法与 MATLAB 的语法有很大不同。
MATLAB PerlDL
------ ------
函数 retval = foo(x,y) sub foo {
retval = x.**2 + x.*y 我的 ($x, $y) = @_;
结束函数返回 $x**2 + $x*$y;
}
不要被所有的新语法吓倒。 这是一个功能的快速运行
PDL 中的声明:
1)分“代表“子程序”。
2)my" 将变量声明为函数的局部变量。
3)@_" 是一个特殊的 Perl 数组,用于保存所有函数参数。这可能看起来
就像一种奇怪的函数方式,但它允许您制作需要
可变数量的参数。 例如,以下函数采用任意数量的
参数并将它们加在一起:
子我的{
我的 ($i, $total) = (0, 0);
对于 $i (@_) {
$总计 += $i;
}
返回 $total;
}
4) 您可以使用以下语法一次为多个变量赋值:
($a, $b, $c) = (1, 2, 3);
所以,在前面的例子中:
# 这声明了两个局部变量并将它们初始化为 0。
我的 ($i, $total) = (0, 0);
# 这需要@_ 的前两个元素并将它们放入$x 和$y。
我的 ($x, $y) = @_;
5)“回报" 语句给出函数的返回值,如果有的话。
附加 功能
ASCII码 文件 IO
读取包含空格分隔的数字列的数据文件(如将被读取
使用 MATLAB 加载 命令)一个使用 PDL rcols 在 PDL::IO::Misc 中。 对于一般
审查 PDL 中可用的 IO 功能,请参阅 PDL::IO 的文档,例如,
“帮助 PDL::IO” pdl2 shell 或来自 shell 命令行的“ pdldoc PDL::IO ”。
时间 结构
为了创建复杂的数据结构,MATLAB 使用“细胞 数组“和”结构体 数组".
Perl 的数组和散列提供类似的功能,但更强大和灵活。
本节只是对 Perl 所提供的内容的快速概述。 要了解更多信息,
请去http://perldoc.perl.org/perldata.html> 或运行命令“perldoc
数据”。
阵列
Perl 数组类似于 MATLAB 的元胞数组,但更灵活。 例如,在
在 MATLAB 中,元胞数组本质上仍然是一个矩阵。 它由行组成,行
必须具有相同的长度。
MATLAB
------
数组 = {1, 12, '你好'; 兰特(3, 2), 那些(3), '垃圾'}
=> 好的
数组 = {1, 12, '你好'; 兰特(3, 2), 那些(3) }
=> 错误
Perl 数组是一种通用的顺序数据结构。 它可以包含任何数据
类型。
PerlDL
------
@array = ( [1, 12, 'hello'] , [ random(3,2),ones(3,3), '垃圾'] )
=> 好的
@array = ( [1, 12, 'hello'] , [ random(3,2), ones(3,3) ] )
=> 好的
@array = ( 5 , {'name' => 'Mike'} , [1, 12, 'hello'] )
=> 好的
请注意,Perl 数组以“@”前缀开头,而不是以“$”开头。
提单。
至 学习 关于 Perl的 数组, 请 go 至 <http://perldoc.perl.org/perldata.html> or
运行 这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 命令 "perldoc 数据”。
哈希
Perl 哈希类似于 MATLAB 的结构体数组:
MATLAB
------
>> 饮料 = struct('type', 'coke', 'size', 'large', 'myarray', {1,2,3})
>>drink.type = '精灵'
>> Drink.price = 12 % 向结构数组添加新字段。
PerlDL
------
pdl> %drink = ( type => 'coke' , size => 'large', mypiddle => ones(3,3,3) )
pdl> $drink{type} = '精灵'
pdl> $drink{price} = 12 # 向哈希添加新字段。
请注意,对于数组,Perl 哈希以“%”前缀而不是“@”开头
piddles 使用的“$”。
至 学习 关于 Perl的 哈希值, 请 go 至 <http://perldoc.perl.org/perldata.html> or
运行 这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 命令 "perldoc 数据”。
性能
PDL 具有强大的性能特性,其中一些在正常情况下是不可用的
数值计算工具。 以下页面将引导您完成这些功能:
PDL::索引
Level:初学者
本初学者教程涵盖了您已经使用的标准“矢量化”功能
从 MATLAB 知道。 使用此页面了解如何避免 for 循环来制作您的程序
更高效。
PDL::线程
Level: 中间的
PDL 的“矢量化”功能超出了大多数数值软件的能力。 在
在本教程中,您将学习如何在更高维度上“穿线”,让您
比在 MATLAB 中更进一步地矢量化您的程序。
基准
Level: 中间的
Perl 带有一个易于使用的 benchmarks 模块,可帮助您了解需要多长时间
执行代码的不同部分。 这是一个很好的工具,可以帮助您集中精力
优化工作。 你可以在线阅读它
(<http://perldoc.perl.org/Benchmark.html>) 或通过命令“perldoc
基准”。
PDL::PP
Level: 先进的
PDL 的预处理器是 PDL 最强大的功能之一。 你写一个函数
特殊标记中的定义和预处理器生成真正的 C 代码,可以
编译。 使用 PDL:PP,您可以获得本地 C 代码的全速,而无需处理
具有 C 语言的全部复杂性。
绘制
PDL 具有全功能的绘图能力。 与 MATLAB 不同,PDL 更依赖于第三方
库(pgplot 和 PLplot)用于其 2D 绘图功能。 它的 3D 绘图和图形
使用 OpenGL 来提高性能和可移植性。 PDL 具有三个主要绘图模块:
PDL::图形::PGPLOT
最棒的 :绘制二维函数和数据集。
这是古老的 PGPLOT 库的接口。 PGPLOT 已广泛应用于
学术界和科学界多年。 部分是因为它的年龄,
PGPLOT 与 PLplot 等较新的软件包相比有一些限制(例如,没有 RGB
图形)。 但它的许多特点仍然使它在科学界广受欢迎
社区。
PDL::图形::PLplot
最棒的 :绘制 2D 函数以及 2D 和 3D 数据集。
这是 PLplot 绘图库的接口。 PLplot 是一个现代的、开源的
用于制作科学图的库。 它支持 2D 和 3D 数据集的绘图。
PLplot 最受 unix/linux/macosx 平台支持。 它有一个活跃的开发人员
社区和对 win32 平台的支持正在改进。
PDL::图形::TriD
最棒的 :绘制 3D 函数。
使用 OpenGL 作为 3D 绘图和数据的后端的原生 PDL 3D 图形库
可视化。 使用 OpenGL,可以轻松操作生成的 3D 对象
鼠标实时。
撰稿 图形用户界面
通过 Perl,PDL 可以访问用于创建跨平台的所有主要工具包
图形用户界面。 一种流行的选择是 wxPerl (http://wxperl.sourceforge.net>)。
这些是 wxWidgets 的 Perl 绑定,wxWidgets 是一个强大的 GUI 工具包,用于编写跨
平台应用。
wxWidgets 旨在使您的应用程序看起来和感觉像一个本地应用程序
每个平台。 例如,Perl IDE 父亲 是用 wxPerl 编写的。
Simulink
Simulink 是图形动态系统建模器和模拟器。 可以购买
单独作为 MATLAB 的附加组件。 PDL 和 Perl 没有直接等价于
MATLAB 的 Simulink。 如果此功能对您很重要,请查看 科学实验室:
<http://www.scilab.org>
Scilab 是另一种数值分析软件。 与 PDL 一样,它是免费和开源的。 它
没有 PDL 的独特功能,但它与 MATLAB 非常相似。 Scilab 自带
科斯 (以前称为 Scicos),一种类似于 Simulink 的图形系统建模器和模拟器。
版权
版权所有 2010 Daniel Carrera ([电子邮件保护])。 您可以分发和/或修改此
与当前 Perl 许可条款相同的文档。
请参见: http://dev.perl.org/licenses/
致谢
我要感谢 David Mertens、Chris Marshall 和 Sigrid Carrera
帮助查看本指南的早期草稿。 没有他们的工作时间,这
对 MATLAB 用户来说,远程文档不会像今天这样有用。
使用 onworks.net 服务在线使用 PDL::MATLABp