求助理解SCILAB常用语法,目标将其代码转译为Python
Scilab语法疑问解答
先贴出你提供的示例代码方便对照:
function [r,theta]=trans_polar(x,y); r=sqrt(x.*x+y.*y); theta=atan(y./x); [nx ny]=size(x); for i=1:ny if x(i)>0 then if y(i)<0 then theta(i) = theta(i)+2*%pi; end end if x(i)<0 then theta(i)=theta(i)+%pi; end end endfunction
困惑点1:点运算符(.*、./)的含义
Scilab里的点运算符是逐元素运算标记,和你猜测的类型转换无关。因为Scilab默认算术运算符(*、/、^等)是矩阵运算逻辑,点运算符会强制让运算在数组的每个对应元素上独立执行:
x.*x:将x数组里的每个元素和自身相乘,等价于Python中numpy数组的x ** 2或np.multiply(x, x)y./x:将y数组里的每个元素除以x数组中对应位置的元素,等价于Python中numpy数组的y / x
举个实际例子:如果x是[1, 2, 3],x.*x的结果是[1, 4, 9];而直接写x*x会触发Scilab报错,因为1行3列的矩阵无法和自身做矩阵乘法。
困惑点2:[nx ny]=size(x)的功能
这行代码用来获取矩阵/数组x的维度信息:
nx会被赋值为x的行数ny会被赋值为x的列数
比如x是3行2列的矩阵,size(x)返回[3, 2],对应nx=3、ny=2。这和Python中numpy数组的x.shape属性类似——Python里x.shape[0]对应Scilab的nx,x.shape[1]对应Scilab的ny。
你示例代码里用for i=1:ny循环,是因为如果x是行向量(1行n列),ny就是元素个数;如果是列向量(n行1列),ny=1,循环仅执行1次(此时x(i)会遍历所有行元素,因为Scilab数组默认按列优先索引)。
内容的提问来源于stack exchange,提问作者user13441637
相关产品推荐
相关产品推荐

