主要内容gydF4y2Ba

matlabFunctiongydF4y2Ba

将符号表达式转换为函数句柄或文件gydF4y2Ba

描述gydF4y2Ba

例子gydF4y2Ba

htgydF4y2Ba= matlabFunction (gydF4y2BafgydF4y2Ba)gydF4y2Ba转换符号表达式或函数gydF4y2BafgydF4y2Ba到MATLABgydF4y2Ba®gydF4y2Ba带有句柄的函数gydF4y2BahtgydF4y2Ba.如果有一个等效的MATLAB函数操作gydF4y2Ba双gydF4y2Ba为符号表达式或函数的数据类型,则转换后的函数可以在没有符号数学工具箱™的情况下使用。gydF4y2Ba

例子gydF4y2Ba

htgydF4y2Ba= matlabFunction (gydF4y2Baf1,…,fNgydF4y2Ba)gydF4y2Ba转换gydF4y2Baf1,…,fNgydF4y2Ba到一个MATLAB函数用gydF4y2BaNgydF4y2Ba输出。函数句柄为gydF4y2BahtgydF4y2Ba.的每个元素gydF4y2Baf1,…,fNgydF4y2Ba可以是符号表达式、函数,也可以是符号表达式或函数的向量或矩阵。gydF4y2Ba

例子gydF4y2Ba

htgydF4y2Ba= matlabFunction (gydF4y2Ba___gydF4y2Ba,gydF4y2Ba名称,值gydF4y2Ba)gydF4y2Ba除前面语法中的任何输入参数组合外,还使用一个或多个名称-值参数指定选项。gydF4y2Ba

例如,可以指定gydF4y2Ba文件gydF4y2Baname-value参数将生成的MATLAB函数写入文件。还可以指定gydF4y2BavargydF4y2Ba名称-值参数生成带有标量变量和向量变量组合的输入参数的MATLAB函数。gydF4y2Ba

例子gydF4y2Ba

全部折叠gydF4y2Ba

转换符号表达式gydF4y2BargydF4y2Ba到一个带有手柄的MATLAB函数gydF4y2BahtgydF4y2Ba.转换后的函数可以在没有符号数学工具箱的情况下使用。gydF4y2Ba

Syms x y r =√(x^2 + y^2);t = matlabFunction(r)gydF4y2Ba
Ht = function_handle with value: @(x,y)√(x.^2+y.^2)gydF4y2Ba

使用逗号分隔的输入转换多个符号表达式。gydF4y2Ba

ht = matlabFunction(r, r²)gydF4y2Ba
ht与价值= function_handle: @ (x, y)(√6 (x ^ 2 + y ^ 2), x ^ 2 + y ^ 2)。gydF4y2Ba

创建一个符号函数并将其转换为带有句柄的MATLAB函数gydF4y2BahtgydF4y2Ba.gydF4y2Ba

Syms x y f(x,y) = x³+ y³;ht = matlabFunction(f)gydF4y2Ba
Ht = function_handle with value: @(x,y)x.^3+y.^3gydF4y2Ba

将生成的MATLAB函数写入文件gydF4y2Ba文件gydF4y2Ba名称-值参数。现有文件将被覆盖。写入文件时,gydF4y2BamatlabFunctiongydF4y2Ba使用命名为gydF4y2Bat0gydF4y2Ba,gydF4y2Bat1gydF4y2Ba等等。方法在文件中包含注释gydF4y2Ba评论gydF4y2Ba选择。gydF4y2Ba

编写MATLAB生成的函数gydF4y2BafgydF4y2Ba到文件gydF4y2BamyfilegydF4y2Ba.gydF4y2Ba

Syms x f = x²+ log(x²);matlabFunction (f,“文件”,“myfile”);gydF4y2Ba
函数f = myfile(x) % myfile % f = myfile(x) %这个函数由符号数学工具箱8.4版生成。t2 = x.^2;F = t2+log(t2);gydF4y2Ba

包括注释gydF4y2Ba版本:1.1gydF4y2Ba在文件中。gydF4y2Ba

matlabFunction (f,‘文件’,‘myfile’,‘评论’,版本:1.1);gydF4y2Ba
函数f = myfile(x)…%版本:1.1 t2 = x.^2;...gydF4y2Ba

在将符号表达式转换为MATLAB函数时,可以指定结果函数的输入参数的顺序。您还可以指定一些输入参数是向量而不是标量变量。gydF4y2Ba

创造一个象征性的表达。gydF4y2Ba

Syms x y z r = x + y/2 + z/3;gydF4y2Ba

转换gydF4y2BargydF4y2Ba到一个MATLAB函数,并将该函数写入文件gydF4y2BamyfilegydF4y2Ba.默认情况下,gydF4y2BamatlabFunctiongydF4y2Ba在转换变量名只包含小写字母的符号表达式时,对输入参数使用字母顺序。生成的输入参数是标量变量gydF4y2BaxgydF4y2Ba,gydF4y2BaygydF4y2Ba,gydF4y2BazgydF4y2Ba.gydF4y2Ba

matlabFunction (r,“文件”,“myfile”);gydF4y2Ba
函数r = myfile(x,y,z) % myfile % r = myfile(x,y,z) r = x+y /2.0+z /3.0;gydF4y2Ba

指定gydF4y2BavargydF4y2Ba名称-值参数作为向量gydF4y2Ba[y z x]gydF4y2Ba来修改生成的MATLAB函数的输入参数的顺序。生成的输入参数是标量变量gydF4y2BaygydF4y2Ba,gydF4y2BazgydF4y2Ba,gydF4y2BaxgydF4y2Ba.gydF4y2Ba

matlabFunction(r,'File','myfile','Vars',[y z x]);gydF4y2Ba
函数r = myfile(y,z,x) % myfile % r = myfile(y,z,x) r = x+y /2.0+z /3.0;gydF4y2Ba

现在,转换一个符号表达式gydF4y2BavgydF4y2Ba到一个输入参数为标量和向量的MATLAB函数。指定gydF4y2BavargydF4y2Ba名称-值参数作为单元格数组gydF4y2Ba{t,[x y z]}gydF4y2Ba.生成的输入参数是一个标量变量gydF4y2BatgydF4y2Ba一个1 × 3的向量变量gydF4y2Bain2gydF4y2Ba.gydF4y2Ba

Syms x y z t v = (x + y/2 + z/3)*exp(-t);matlabFunction (v,‘文件’,‘myfile’,“var”{t [x y z]});gydF4y2Ba
函数v = myfile(t,in2) % myfile % R = myfile(t,in2) x = in2(:,1);Y = in2(:,2);Z = in2(:,3);V = exp(-t).*(x+y /2.0+z /3.0);gydF4y2Ba

若要生成带有矢量变量输入参数的MATLAB函数,请指定gydF4y2BavargydF4y2Ba作为单元格数组的名称-值参数。gydF4y2Ba

创建一个求两个1 × 3向量点积的符号表达式。gydF4y2Ba

Syms x y [1 3] real f = dot(x,y);gydF4y2Ba

转换表达式gydF4y2BafgydF4y2Ba到一个MATLAB函数。指定gydF4y2BavargydF4y2Ba作为单元格数组gydF4y2Ba{x, y}gydF4y2Ba.生成的输入参数是两个1 × 3矢量变量gydF4y2Ba三机一体gydF4y2Ba而且gydF4y2Bain2gydF4y2Ba对应于gydF4y2BaxgydF4y2Ba而且gydF4y2BaygydF4y2Ba,分别。gydF4y2Ba

matlabFunction (f,‘文件’,‘myfile’,“var”{x, y});gydF4y2Ba
函数f = myfile(in1,in2) % myfile % f = myfile(in1,in2) x1 = in1(:,1);X2 = in1(:,2);X3 = in1(:,3);Y1 = in2(:,1);Y2 = in2(:,2);Y3 = in2(:,3);F = x1.*y1+x2.*y2+x3.*y3;gydF4y2Ba

现在创建一个包含四个变量的符号函数。gydF4y2Ba

信谊g (x, y, z, t) g (x, y, z, t) = x ^ 2 + y ^ 2 + z ^ 2 - t ^ 2;gydF4y2Ba

转换函数gydF4y2BaggydF4y2Ba到一个MATLAB函数。的输入变量将生成的输入参数指定为4乘1的列向量gydF4y2BaggydF4y2Ba,指定gydF4y2BavargydF4y2Ba作为包含4 × 1向量的单元格数组。你可以使用gydF4y2BaargnamesgydF4y2Ba自动获取输入变量gydF4y2BaxgydF4y2Ba,gydF4y2BaygydF4y2Ba,gydF4y2BazgydF4y2Ba,gydF4y2BatgydF4y2Ba从gydF4y2BaggydF4y2Ba.gydF4y2Ba

myfunction matlabFunction (g,“文件”,“”,“var”{argnames (g)”。});gydF4y2Ba
函数g = myfunction(in1) % myfunction % g = myfunction(in1) x = in1(1,:);Y = in1(2,:);Z = in1(3,:);T = in1(4,:);G = -t.²+x.²+y.²+z.²;gydF4y2Ba

当您将符号表达式转换为MATLAB函数并将结果函数写入文件时,gydF4y2BamatlabFunctiongydF4y2Ba默认情况下优化代码。这种方法可以帮助简化和加快使用该文件的进一步计算。然而,从一些符号表达式和函数生成优化的代码可能很耗时。使用gydF4y2Ba优化gydF4y2Ba禁用代码优化。gydF4y2Ba

创造一个象征性的表达。gydF4y2Ba

符号x r = x^2*(x^2 + 1);gydF4y2Ba

转换gydF4y2BargydF4y2Ba到一个MATLAB函数,并将函数写入文件gydF4y2BamyfilegydF4y2Ba.默认情况下,gydF4y2BamatlabFunctiongydF4y2Ba创建包含优化代码的文件。gydF4y2Ba

f = matlabFunction(r,'File','myfile');gydF4y2Ba
函数r = myfile(x) % myfile % r = myfile(x) t2 = x.^2;R = t2.*(t2+1.0);gydF4y2Ba

的值禁用代码优化gydF4y2Ba优化gydF4y2Ba来gydF4y2Ba假gydF4y2Ba.gydF4y2Ba

f = matlabFunction(r,'File','myfile','Optimize',false);gydF4y2Ba
函数r = myfile(x) % myfile % r = myfile(x) r = x.^2.*(x.^2+1.0);gydF4y2Ba

当你把一个符号矩阵转换成一个MATLAB函数时,gydF4y2BamatlabFunctiongydF4y2Ba默认情况下,表示带有密集矩阵的符号矩阵。如果输入符号矩阵的大部分元素为零,则更有效的方法是用稀疏矩阵表示符号矩阵。gydF4y2Ba

创建一个3 × 3的符号对角线矩阵。gydF4y2Ba

syms x A = diag(x*ones(1,3))gydF4y2Ba
A = [x, 0,0] [0, x, 0] [0,0, x]gydF4y2Ba

转换gydF4y2Ba一个gydF4y2Ba到一个表示数字矩阵的MATLAB函数,并将结果写入文件gydF4y2Bamyfile1gydF4y2Ba.默认情况下,生成的MATLAB函数创建一个密集的数值矩阵,指定矩阵的每个元素,包括所有零元素。gydF4y2Ba

f1 = matlabFunction(A,'File','myfile1');gydF4y2Ba
函数= myfile1 (x) % myfile1 % = myfile1 (x) =重塑([x, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, x], [3 3]);gydF4y2Ba

转换gydF4y2Ba一个gydF4y2Ba得到一个MATLAB函数gydF4y2Ba稀疏的gydF4y2Ba来gydF4y2Ba真正的gydF4y2Ba.现在,生成的MATLAB函数创建一个稀疏数值矩阵,仅指定非零元素,并假设所有其他元素都为零。gydF4y2Ba

f2 = matlabFunction(A,'File','myfile2','Sparse',true);gydF4y2Ba
函数= myfile2 (x) % myfile2 % = myfile2 (x) =稀疏([1,2,3],[1,2,3],[x, x, x], 3, 3);gydF4y2Ba

在将符号表达式转换为MATLAB函数时,可以指定输出变量的名称。请注意,gydF4y2BamatlabFunctiongydF4y2Ba没有gydF4y2Ba文件gydF4y2Ba参数(或将文件路径指定为空字符向量)创建一个函数句柄并忽略gydF4y2Ba输出gydF4y2Ba国旗。gydF4y2Ba

创造象征性的表达gydF4y2BargydF4y2Ba而且gydF4y2Ba问gydF4y2Ba.gydF4y2Ba

Syms x y z r = x²+ y²+ z²;Q = x²- y²- z²;gydF4y2Ba

转换gydF4y2BargydF4y2Ba而且gydF4y2Ba问gydF4y2Ba到一个MATLAB函数,并将得到的函数写入文件gydF4y2BamyfilegydF4y2Ba,它返回一个包含两个元素的向量,gydF4y2Baname1gydF4y2Ba而且gydF4y2Baname2gydF4y2Ba.gydF4y2Ba

f = matlabFunction(r,q,'File','myfile',…“输出”,{‘name1’,‘name2});gydF4y2Ba
function [name1,name2] = myfile(x,y,z) % myfile % [name1,name2] = myfile(x,y,z) t2 = x.^2;T3 = y.^2;T4 = z.^2;Name1 = t2+t3+t4;如果nargout > 1 name2 = t2-t3-t4;结束gydF4y2Ba

通过将符号函数转换为匿名MATLAB函数,可以加快给定坐标下符号函数的求值速度。使用gydF4y2BamatlabFunctiongydF4y2Ba执行转换。对符号函数求值将返回精确的符号数,而对MATLAB函数求值将返回双精度数。gydF4y2Ba

创建一个符号函数gydF4y2Baf (x, y, z)gydF4y2Ba这是一个函数gydF4y2BaxgydF4y2Ba,gydF4y2BaygydF4y2Ba,gydF4y2BazgydF4y2Ba.gydF4y2Ba

信谊gydF4y2Baf (x, y, z)gydF4y2BaF (x,y,z) = y*z*sin(x) + x*sin(z)* cosy - z^3;gydF4y2Ba

在指定的间隔内创建3-D网格坐标。gydF4y2Ba

[xDouble,yDouble,zDouble] = meshgrid(1:20,1:50,1:20);gydF4y2Ba

求这些坐标上的符号函数。使用一对测量所经过的时间gydF4y2Ba抽搐gydF4y2Ba而且gydF4y2BatocgydF4y2Ba调用。gydF4y2Ba

tic fResult = f(xDouble,yDouble,zDouble);tocgydF4y2Ba
运行时间为1.582651秒。gydF4y2Ba

这里,求值很慢,但返回的是精确的符号数。显示结果的示例。gydF4y2Ba

fResult (1:2, 1:2, 20)gydF4y2Ba
ans =gydF4y2Ba

(gydF4y2Ba 20.gydF4y2Ba 罪gydF4y2Ba (gydF4y2Ba 1gydF4y2Ba )gydF4y2Ba +gydF4y2Ba 因为gydF4y2Ba (gydF4y2Ba 1gydF4y2Ba )gydF4y2Ba 罪gydF4y2Ba (gydF4y2Ba 20.gydF4y2Ba )gydF4y2Ba -gydF4y2Ba 8000gydF4y2Ba 20.gydF4y2Ba 罪gydF4y2Ba (gydF4y2Ba 2gydF4y2Ba )gydF4y2Ba +gydF4y2Ba 2gydF4y2Ba 因为gydF4y2Ba (gydF4y2Ba 1gydF4y2Ba )gydF4y2Ba 罪gydF4y2Ba (gydF4y2Ba 20.gydF4y2Ba )gydF4y2Ba -gydF4y2Ba 8000gydF4y2Ba 40gydF4y2Ba 罪gydF4y2Ba (gydF4y2Ba 1gydF4y2Ba )gydF4y2Ba +gydF4y2Ba 因为gydF4y2Ba (gydF4y2Ba 2gydF4y2Ba )gydF4y2Ba 罪gydF4y2Ba (gydF4y2Ba 20.gydF4y2Ba )gydF4y2Ba -gydF4y2Ba 8000gydF4y2Ba 40gydF4y2Ba 罪gydF4y2Ba (gydF4y2Ba 2gydF4y2Ba )gydF4y2Ba +gydF4y2Ba 2gydF4y2Ba 因为gydF4y2Ba (gydF4y2Ba 2gydF4y2Ba )gydF4y2Ba 罪gydF4y2Ba (gydF4y2Ba 20.gydF4y2Ba )gydF4y2Ba -gydF4y2Ba 8000gydF4y2Ba )gydF4y2Ba

为了加快函数的求值速度,将符号函数转换为MATLAB函数使用gydF4y2BamatlabFunctiongydF4y2Ba.求相同坐标下的MATLAB函数。gydF4y2Ba

f1 = matlabFunction(f);tic fResult = f1(xDouble,yDouble,zDouble);tocgydF4y2Ba
运行时间为0.010327秒。gydF4y2Ba

在这里,计算速度更快。求值的MATLAB函数返回双精度数。显示结果的示例。gydF4y2Ba

fResult (1:2, 1:2, 20)gydF4y2Ba
ans =gydF4y2Ba2×2gydF4y2Ba10gydF4y2Ba3.gydF4y2Ba× -7.9827 -7.9808 -7.9667 -7.9644gydF4y2Ba

输入参数gydF4y2Ba

全部折叠gydF4y2Ba

要转换为MATLAB函数的符号输入,指定为符号表达式、函数、向量或矩阵。转换稀疏符号向量或矩阵时,指定gydF4y2Ba稀疏的gydF4y2Ba名称-值参数为gydF4y2Ba真正的gydF4y2Ba.gydF4y2Ba

符号输入转换为MATLAB函数与gydF4y2BaNgydF4y2Ba输出,指定为符号表达式、函数、向量或矩阵,用逗号分隔。gydF4y2Ba

matlabFunctiongydF4y2Ba不为符号向量或矩阵的每个元素创建单独的输出参数。例如,gydF4y2Baht = matlabFunction([x + 1, y + 1])gydF4y2Ba创建带有一个输出参数的MATLAB函数,而gydF4y2Bat = matlabFunction(x + 1, y + 1)gydF4y2Ba创建带有两个输出参数的MATLAB函数。gydF4y2Ba

名称-值参数gydF4y2Ba

指定可选参数对为gydF4y2BaName1 = Value1,…,以=家gydF4y2Ba,在那里gydF4y2Ba的名字gydF4y2Ba参数名称和gydF4y2Ba价值gydF4y2Ba对应的值。名称-值参数必须出现在其他参数之后,但对的顺序无关紧要。gydF4y2Ba

例子:gydF4y2BamatlabFunction (f,文件=“myfile”,优化= false)gydF4y2Ba

在R2021a之前,使用逗号分隔每个名称和值,并将其括起来gydF4y2Ba的名字gydF4y2Ba在报价。gydF4y2Ba

例子:gydF4y2BamatlabFunction (f,“文件”,“myfile”,“优化”,假)gydF4y2Ba

要包含在文件头中的注释,指定为字符向量、字符向量的单元格数组或字符串数组。gydF4y2Ba

包含生成的MATLAB函数的文件的路径,指定为字符向量或字符串标量。生成的函数接受类型的参数gydF4y2Ba双gydF4y2Ba并且可以使用没有符号数学工具箱。如果gydF4y2Ba文件gydF4y2Ba是空的,gydF4y2BamatlabFunctiongydF4y2Ba生成一个匿名函数。如果gydF4y2Ba文件gydF4y2Ba不会以gydF4y2Ba.m,函数追加gydF4y2Ba.m.gydF4y2Ba

写入文件时,gydF4y2BamatlabFunctiongydF4y2Ba使用命名为gydF4y2Bat0gydF4y2Ba,gydF4y2Bat1gydF4y2Ba等等。若要禁用代码优化,请使用gydF4y2Ba优化gydF4y2Ba论点。gydF4y2Ba

看到gydF4y2Ba编写MATLAB函数文件注释gydF4y2Ba.gydF4y2Ba

允许优化写入函数文件的代码的标志,指定为gydF4y2Ba真正的gydF4y2Ba或gydF4y2Ba假gydF4y2Ba.gydF4y2Ba

写入文件时,gydF4y2BamatlabFunctiongydF4y2Ba在默认情况下,使用命名的中间变量优化代码gydF4y2Bat0gydF4y2Ba,gydF4y2Bat1gydF4y2Ba等等。gydF4y2Ba

使用gydF4y2BamatlabFunctiongydF4y2Ba没有gydF4y2Ba文件gydF4y2Ba参数(或将文件路径指定为空字符向量)创建一个函数句柄。在这种情况下,默认情况下代码没有优化。如果您试图通过设置强制代码优化gydF4y2Ba优化gydF4y2Ba来gydF4y2Ba真正的gydF4y2Ba,然后gydF4y2BamatlabFunctiongydF4y2Ba抛出错误。gydF4y2Ba

看到gydF4y2Ba禁用代码优化gydF4y2Ba.gydF4y2Ba

在稀疏和密集矩阵生成之间切换的标志,指定为gydF4y2Ba真正的gydF4y2Ba或gydF4y2Ba假gydF4y2Ba.当你指定gydF4y2Ba稀疏的gydF4y2Ba作为gydF4y2Ba真正的gydF4y2Ba,生成的MATLAB函数用稀疏数值矩阵表示符号矩阵。指定gydF4y2Ba稀疏的gydF4y2Ba作为gydF4y2Ba真正的gydF4y2Ba当转换包含许多零元素的符号矩阵时。通常,对稀疏矩阵的操作比对密集矩阵的相同操作更有效。gydF4y2Ba

看到gydF4y2Ba生成稀疏矩阵gydF4y2Ba.gydF4y2Ba

在生成的MATLAB函数中输入变量或向量的顺序,指定为字符向量、符号变量向量或字符向量、符号变量或符号变量向量的一维单元格数组。gydF4y2Ba

中指定的输入变量的数量必须等于或超过符号变量的数量gydF4y2BafgydF4y2Ba.不使用相同的名称为输入变量指定gydF4y2BavargydF4y2Ba和指定的输出变量gydF4y2Ba输出gydF4y2Ba.gydF4y2Ba

默认情况下,当转换变量名只包含小写字母的符号表达式时,输入变量的顺序为字母顺序。转换符号函数时,它们的输入参数出现在其他变量前面,所有其他变量都按字母顺序排序。gydF4y2Ba

指定gydF4y2BavargydF4y2Ba作为一个矢量来生成一个输入参数为标量变量的MATLAB函数。指定gydF4y2BavargydF4y2Ba作为单元格数组来生成带有标量变量和向量变量组合的输入参数的MATLAB函数。gydF4y2Ba

看到gydF4y2Ba为生成的函数指定输入参数gydF4y2Ba.gydF4y2Ba

输出变量的名称,指定为字符向量的一维单元格数组。gydF4y2Ba

如果您没有指定输出变量名,那么它们将与调用时使用的名称一致gydF4y2BamatlabFunctiongydF4y2Ba.如果你打电话gydF4y2BamatlabFunctiongydF4y2Ba使用表达式而不是单个变量,输出变量的默认名称由单词组成gydF4y2Ba出gydF4y2Ba后面跟着一个数字,例如,gydF4y2Baout3gydF4y2Ba.gydF4y2Ba

不使用相同的名称为输入变量指定gydF4y2BavargydF4y2Ba和指定的输出变量gydF4y2Ba输出gydF4y2Ba.gydF4y2Ba

matlabFunctiongydF4y2Ba没有gydF4y2Ba文件gydF4y2Ba参数(或将文件路径指定为空字符向量)创建一个函数句柄。在这种情况下,gydF4y2BamatlabFunctiongydF4y2Ba忽略了gydF4y2Ba输出gydF4y2Ba国旗。gydF4y2Ba

看到gydF4y2Ba指定输出变量gydF4y2Ba.gydF4y2Ba

输出参数gydF4y2Ba

全部折叠gydF4y2Ba

函数句柄,可以作为数值函数的输入参数,作为MATLAB函数句柄返回。gydF4y2Ba

限制gydF4y2Ba

  • 一些符号函数没有对应的MATLAB函数操作gydF4y2Ba双gydF4y2Ba数据类型,例如gydF4y2Ba简化gydF4y2Ba而且gydF4y2Ba解决gydF4y2Ba,都作为符号函数保存在转换后的MATLAB函数句柄或文件中。由这些函数组成的转换后的文件不能使用gydF4y2BaMATLAB编码器™gydF4y2Ba或gydF4y2BaMATLAB编译器™gydF4y2Ba.方法创建自己的函数gydF4y2Ba双gydF4y2Ba数据类型来替换这些符号函数。如果您对无法部署的符号函数感兴趣,请联系gydF4y2BaMathWorksgydF4y2Ba技术支持gydF4y2Ba.gydF4y2Ba

提示gydF4y2Ba

版本历史gydF4y2Ba

在R2008b中引入gydF4y2Ba

Baidu
map