需要一些帮助来理解一些 SCILAB 习语

Need some help understanding a couple of SCILAB idioms

提问人:Eric1965 提问时间:10/23/2023 更新时间:10/23/2023 访问量:34

问:

标题几乎涵盖了它 - 我需要一些帮助来理解一些 SCILAB 习语(最终目标:将一些 SCILAB 代码转换为 Python)

直到今天,我从未听说过,更不用说看过 SCILAB 或其代码了,但是在寻找一种方法来实现我当前项目的目标时,该项目主要是用 Python 编写的,我偶然发现了一个 SCILAB 模块,根据它的描述,它似乎非常接近我想要做的事情——足够接近,如果我把它翻译成我实际擅长的语言, 它可能是完美的。由于我已经在使用 Python 工作,这将是翻译目标。

大多数 SCILAB 语言看起来很容易理解,我已经找到了已经有帮助的文档,但我遇到了一些我认为是 SCILAB 习语的习语,这些习语显然在 SCILAB 用户中很常见,以至于没有人/任何东西(无论如何,我还没有遇到过)似乎认为它们需要讨论, 但是对这门语言来说,这个总 n00b 几乎没有意义。

在从我找到的模块中取出的这个函数中可以看到给我带来麻烦的两个示例:

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

很明显(或者至少在我看来是这样),这个函数的最终目标是将一对 X/Y 笛卡尔坐标转换为极坐标,并将转换后的结果作为 r 和 theta 返回,但是代码中有几件事让我挠头并担心我在尝试进行翻译时可能会忽略一些重要的东西。

首先是声明。r=sqrt(x.*x+y.*y)

显然,它取“某物”的平方根并将其分配给 r,但我无法确切地确定“某物”是什么。如果它没有这些句点/小数点,那么假设它取值的平方根(x 平方加 y 平方)并将其填充到返回值“r”中是完全有意义的。既然它确实有它们,我就迷路了。下一行 () 让我同样头疼 - 这两个语句中的句点/小数点是什么意思?theta=atan(y./x)

我能做出的最好的猜测是,尾随句点可能意味着“将句点之前的变量视为浮点值”,就像在 C 中进行类型转换的速记方式一样 - 也许等同于这个 C 代码?

int y = 5;
float x;

x = (float)y;

另一个让我感到困惑的是第 4 行: 类似的语句出现在模块的其余代码中,所以它似乎是一个非常常见的 SCILAB 习语,但常见并不能告诉我它的实际含义,至少到目前为止,我在我找到的文档中找不到任何专门解决这种结构的内容。我捡到了一些提示,让我认为它在功能上可能与旧的 Applesoft BASIC “DIM” 关键字相似 - 如果你想要一个浮点数的二维数组,5 行,每行 8 列,你会说“DIM A(5,8)”,而 A 将是一个 5x8 的浮点值数组, 全部设置为 0.0 - 但这只是我最好的猜测。[nx ny]=size(x);

我至少有这个猜测在正确的邮政编码中吗?如果没有,我应该如何阅读它?

有没有 SCILAB 用户可以让我直截了当?

习语 scilab

评论


答:

0赞 cesonha 10/23/2023 #1

两者在元素上都等同于乘法和除法运算,因为 x 和 y 可以是 n 维的向量,问题是这种实现是从 (x, y) 作为两个标量到极坐标的更通用的转换形式。.*./

该行是一个赋值语句,它将使用参数调用的函数的结果分配给两个变量,并且,此处的逻辑相同,因为 x 可以是具有 n 个维度的向量,因此它可以返回多个值,此函数的文档在描述部分中对此进行了说明。[nx ny]=size(x);sizexnxny

理解此函数的可能更简单的方法是想象一个简单的场景,其中 和 都是标量xy

所以会和 和 一样.**.//

[nx ny] = size(x)将这两个变量赋值 1(这将毫无意义),因此实现将更易于理解,例如:

function [r, theta] = trans_polar(x, y)
    r = sqrt(x*x + y*y);
    theta = atan(y / x);

if x > 0 then
    if y < 0 then
        theta = theta + 2*%pi;
    end
end
if x < 0 then
    theta = theta + %pi;
end
endfunction

我想你遇到的困难主要是因为你发现的函数适用于任何维度的向量!

评论

0赞 Eric1965 10/23/2023
这至少让我指出了正确的方向。很高兴知道,虽然我可能是这门语言的新手,但我至少可以大致了解它想要做什么:)现在弄清楚(刚刚注意到的)“%”是什么意思。它不太可能是模/余数运算符......从上下文来看,我猜它表示一个常量、一个内置的,或者可能两者兼而有之,类似于在 Python 中说“math.pi”。啊哈!另一个窗口中的信息刚刚证实,这(非常接近)它到底是什么。在我发布时,在文档中还没有走得足够远(您正在查看我的同一个站点)以注意到 size()。
0赞 cesonha 10/23/2023
很高兴我能提供帮助,是的,% 代表 SCILAB 中一些受保护的常量