如何通过引用向Scilab函数传递变量
我想拥有一个能够更改其输入变量的scilab函数,例如C中我可以有 void double(int* x){ *x *= 2; return; } 有intppty,funptr,addinter,istk,sadr和stk在Scilab中似乎很重要,但是我找不到任何有效的示例. Scilab确实具有pointer类型(即128).如果您能帮助我解决这个问题,我会很感激. p.s.1.我也反映了这个问题 p.s.2. scilab也具有intersci,fort,fort,external,external,call,API_Scilab/gateway可以接口C/C++功能或Fortran子例程.不幸的是,intersci已被弃用,SWIG似乎仅适用于有限的C++兼容性. p.s.3. scilab具有 p.s.4.方式API_Scilab/gateway工作,基本上是您使用提供的函数来开发代码bu header file api_scilab.h
0 2023-05-20
编程技术问答社区
Scilab: 对Lotka Volterra模型进行参数估计 Scilab
我试图重现以下链接的脚本: 我在结果中得到了类似的错误. 您可以指导我在没有错误的情况下运行脚本. Gracias 爱马仕 解决方案 SCILAB 5.5.1或更小的解决方案 问题在于求解器以某种方式达到了无法在每个t上解决颂歌并在某个点停止的点.因此,您的y_calc大小小于y_exp. 如果这不是您的问题,请在Differences函数的第6行上更改diffmat diffmat = y_calc' - y_exp(1:size(y_calc',1),:) SCILAB 6.0.0或更大的解决方案 ode函数现在在scilab 6.x.x. 中未能计算时会引起错误 使用try ... catch ... end语句,我们可以让程序处理. 是错误的(我将解释原因)解决方案正在将Differences函数的第5行更改为 try // test if ode works normally [y_calc,odew,odeiw]=ode
6 2023-05-19
编程技术问答社区
如何将依赖性变量包括在Scilab中的ode-solver中?
我目前正在求解一个非线性颂歌系统.这是一组运动学运动方程,我需要用给定的anguar速度计算位置角 我发现,如何使用列表添加取决于时间的函数,但是问题是,如何添加一个也依赖时间但作为向量给出的参数. 简化的是在以下代码中编写. c(t)是时间函数. function dx = f(t, x, c) dx(1) = x(1)*sin(x(2)) dx(2) = c*x(2)*cos(x(1)) dx(3) = t*cos(x(3)) endfunction c = 1:32; // values from measured signal, here simplyfied y0 = [0.1;0.1;0.1]; t0 = 0; t = 0:0.1:%pi; y = ode(y0, t0, t, list (f, c)); 解决方案 参见 如何将功能表转换为插值函数. 使用interpln线性插值 本质上,在右侧功能dx=f(t,x,tc_
4 2023-05-19
编程技术问答社区
如何在Octave或Scilab中使用并行'for'循环?
我有两个用于在MATLAB代码中运行的循环.内部循环使用12个处理器中的Matlabpool并行化(这是一台机器中允许的最大MATLAB). 我没有分发计算许可证.请帮助我使用八度或scilab如何做.我只想并行化"仅对"循环. 我在Google中搜索它时给出了一些断开的链接. 解决方案 parfor尚未在八度中真正实现.关键字被接受,但仅仅是for的同义词( .nabble.com/parfor-td4630575.html ). 并行包装的pararrayfun和parcellfun在多核算机上方便. 它们通常是一个很好的替代品. 有关示例,请参见 http://wiki.octave.org/parallel_package . 要安装,请发行(仅一次) pkg install -forge parallel ,然后在每个会话上一次 pkg load parallel 使用函数之前 其他解决方案 在Scilab中您可以使用
2 2023-05-19
编程技术问答社区
优化、时间复杂性和流程图(Scilab)。
我试图优化此代码,但是不再需要优化. 请帮助为该算法构建流程图. A = [-1,0,1,2,3,5,6,8,10,13,19,23,45]; B = [0,1,3,6,7,8,9,12,45]; N1 = length(A); N2 = length(B); t = 1; m = 10; C = []; for i=1:N1 for j=1:N2 if A(i)==B(j) break else if j==N2 C(t)=A(i); t=t+1; end end end end disp(C); N3=length(C); R = []; y = 1; for l=1:N3 if C(l)>m R(y)=C(l); y=y+1; end e
2 2023-05-12
编程技术问答社区
Scilab中ODE的奇怪行为:方程dy/dx=A没有得到正确解决
我仍在学习Scilab(5.5.2),所以我正在编写和运行测试代码以熟悉该软件. 要测试数值微分方程求解器,我从方程式 dy/dx = a 开始容易,它具有解决方案 y = ax+c (线方程) . 这是我写的代码: // Function y = A*x+1 function ydot=fn(x, A) ydot=A endfunction A=2; //Initial conditions x0=0; y0=A*x0+1; //Numerical Solution x=[0:5]; y= ode(y0,x0,x,fn); //Analytical solution y2 = A*x+1; clf(); plot(x, y); plot(x, y2, '-k'); //End 这些是出乎意料的结果: y = 1. 2.7182824 7.3890581 20.085545 54.598182 148.41327 y2 =1.3.5. 7. 9
2 2023-05-08
编程技术问答社区
在Scilab中求解ODE
我试图通过求解ODE在Scilab中进行一些电路分析.但是我需要根据功能的当前值更改ODE.我已经使用RK4方法在Scala中实现了解决方案,并且可以很好地工作.现在,我正在尝试执行相同的操作,但是在Scilab中使用标准功能.而且它不起作用.我试图单独解决这两种频率,还可以. clear state = 0 // state 0 is charging, 1 is discharging vb = 300.0; vt = 500.0; r = 100.0; rd = 10.0; vcc = 600; c = 48.0e-6; function dudx = curfunc(t, uu) if uu vt state = 1 end select state case 0 then // charging dudx = (vcc - uu) / (r * c
4 2023-05-08
编程技术问答社区
用C++或Scilab或Octave或R进行大量数据的统计。
我最近需要计算大数(约800万)双打的平均值和标准偏差.考虑到双双字节需要8个字节,如果将所有双打读入RAM,则大约需要6 GB.我认为我可以使用C ++或其他高级语言的鸿沟和征服方法,但这似乎很乏味.有什么方法可以用R,Scilab或八度等高级语言立即完成所有操作?谢谢. 解决方案 听起来您可以使用R-Grid或Hadoop来获得良好的优势. 您当然会意识到,可以轻松地计算平均值和标准偏差,而不必将所有值读为内存.像这样的Java类那样,只要保持总跑步.您需要的只是总和,总和和点数.我免费保持最小和最大. 这也清楚地表明了地图还原的工作方式.您可以实例化几个统计的实例,让每个实例保持总和,正方价和800m点部分的点数.然后让减少步骤组合它们并使用相同的公式获得最终结果. import org.apache.commons.lang3.StringUtils; import java.util.Collection; /** * Statistics ac
0 2023-05-07
编程技术问答社区
是否有类似于C语言的预处理器指令用于Octave和Scilab,以实现代码的相互兼容?
在C/C ++语言中,可以使用宏或称为"人均指令"来指示编译器应如何读取代码. #def,#ifdef,#ifndef,#else,#endif的简单命令使编译器能够检查操作系统,编译器和其他环境信息.我知道八度和scilab是被解释的语言,但是我想知道是否有任何方法告诉解释器在加载脚本时替换脚本的部分?例如,我可以编写一个基于Scilab语法//评论的代码,然后指示解释器将其读取为Octave的评论Sytax,为#或%?这似乎是Scilab八度兼容性的主要问题之一. 如果有一种方法可以指示口译员检查解释器的信息Scilab/scicolab/octave/freemat,Julia ...和版本...然后基于该信息,则有一些#ifdef 块...然后可以编写与上述多个解释器兼容的代码.如果您可以让我知道是否有可能,以及是否可以编写与Octave和Scilab兼容的代码,我将不胜感激吗? p.s.1 不同的方法是: 具有常规if then elseif else end
0 2023-05-07
编程技术问答社区
atomsInstall找不到通过chocolatey安装的mingw编译器。
以下这个问题,我是我不太确定问题在哪里,所以我为所有涉及的组件添加标签.我正在尝试在Scilab内使用MINGW编译器.有一个MINGW原子,据说应该由 安装 atomsInstall('mingw') 返回空和 atomsLoad('mingw'); 返回错误: mingw编译器支持Scilab 负载宏 警告:未检测到mingw编译器. 负载帮助 和haveacompiler()返回false F,尽管我通过巧克力安装了编译器.有什么问题: 需要将编译器添加到Windows环境变量或类似的内容中?我想巧克力应该默认情况下照顾好.我已经反映了这个问题 mingw scilab原子中有一个错误.我已经联系了维护者Antoine Elias和Allan Cornet. 这是一个MINGW错误,因为有些人已经使用了.我也分享了这个问题, p.s.1.我已经报告了在这里. p.s.2.我已经通过 解决方案 解决方案:在Scilab
22 2023-03-28
编程技术问答社区
如何使Scilab在Linux(Ubuntu)中打开与/dev/ttyACM0 USB端口的串行通信
我正在尝试在 scilab 和arduino之间打开串行通信.但是,/dev/tty**ACM0**端口中的Linux Ubuntu始终识别Arduino.当我在scilab中写h=openserial(1,"9600,n,8,1)时,我知道我要说的是,打开一个串行通信到COM1或/dev/tty**S0**在linux中. 但是,例如,如果我使用h=openserial(N,"9600,n,8,1),假设N=port number,我将始终在Windows和/dev/tty**S**(N-1)中使用comn. 如何通过scilab中的/dev/tty**ACM0**端口打开串行通信? 解决方案 查看 openserial.sci openserial.sci 来自 scilab的串行通信工具箱 repo, function h=openserial(p,smode,translation,handshake,xchar,timeout) //port name
16 2023-03-22
编程技术问答社区
将Ode45()转换为Scilab
我正在尝试将此脚本从MATLAB转换为Scilab.我尝试了SCILAB工具进行转换,但没有输出崩溃,因此我手工进行.这就是我通过将评论从%更改为//来获得的. @markovprocessfunc是指我可以使用Scilab自动工具转换的另一个文件. // Markovprocess // Main program of the markovprocess simulation // The system is defined by the generator matrix A // Ulf Jeppsson, January 2017 global B // Define the duration of the simulation disp(' ') disp('Automation 2017, Markov processes') disp(' ') tend = input('Set simulation time = '); disp(' ') // Make a
42 2023-03-21
编程技术问答社区
不用matlab提取.mat数据-尝试scilab但不成功
我已经下载了一个我感兴趣的数据集.但是,它以.mat格式,我无法访问MATLAB. 我已经做了一些谷歌搜索,它说我可以在Scilab中打开它. 我尝试了几件事,但是我还没有找到任何好的教程. 我做过 fd = matfile_open(" file.mat") matfile_listvar(fd) 并在没有扩展名的情况下打印出文件名.我尝试了 var1 = matfile_varreadnext(fd) ,那只是给我" var1 =" 我真的不知道如何组织数据.存储库描述了其中包含的数据,但没有组织. 那么,我的问题是,我在提取/查看这些数据时做错了什么?如果有更好的工具,我对此我不愿意进行. 解决方案 一个选项是使用 octave ,它可以读取.mat文件并运行大多数Matlab .m文件. Octave是开源的,可用于Linux,Mac和Windows的二进制文件.在八度的内部,您可以使用: 加载文件 load
14 2023-03-20
编程技术问答社区
Scilab中浮点计算的精度是多少?
注意:我使用了MATLAB标签,以防它们保持相同的精度. (据我所知,这两个程序都非常相似.) 作为我先前问题的后续措施(此处),我正在尝试确定需要设置的精度(在我当前从SCILAB代码转换的C ++程序中)模拟 SCILAB程序的准确性.本质上,两个程序都产生相同的结果(或非常相似). 计算Scilab中的浮点计算时,保持精度的水平是多少? 我已经阅读了(在这里和其他一些地方)在c ++中,双重只能准确地维护约16个小数的位置,例如: 4 8 12 16 v v v v 0.947368421052631578 long double 0.947368421052631526 double 与Scilab相比,这种准确性有多相似? 解决方案 重新发布评论作为答案: IEEE 754双精度浮点数是大多数通用语言中的标准表示,例如MATLAB,C ++和SCILAB: https://www.googl
6 2023-03-20
编程技术问答社区
在Scilab上使用MATLAB代码
是否可以在Scilab上使用MATLAB代码?这是说Scilab是Matlab的"克隆"的含义? 解决方案 我不会押注.但是,如果您的代码很简单,那么机会就足够了. 问题是: 有加密的 p-code in Scilab无法打开的Matlab. Matlab通常带有许多工具箱,这些工具箱可能无法使用(我认为特别是Simulink) 最后但并非最不重要的一点(我不知道Scilab)通常在实现功能方面存在微小差异. 其他解决方案 有一个工具可以自动将MATLAB源转换为Scilab源,称为 mfile2sci函数的文档. 其他解决方案 是的,您可以在Scilab上使用MATLAB代码.有关更多信息,请参见这些链接:
46 2023-03-20
编程技术问答社区
如何使用scilab和xfpoly给零件涂上红色?
如何使用scilab和xfpoly将零件涂成红色.是否有一种方法可以在两个边界之间的积分之后为计算出的表面上色吗? 解决方案 我想您的功能与您上一篇文章中的g(x)一起调用.以下应执行您想要的事情: x=linspace(5,50,200); plot(x,g(x)) deff('y=f(x,y0)','y=g(x)-y0') x1 = fsolve(45,list(f,40)) x2 = fsolve(x1,list(f,30)) xv = linspace(x1,x2,1000); yv = [40 g(xv) 30]; xv = [45 xv 45]; xfpoly(xv,yv,color('red'))
4 2023-03-20
编程技术问答社区
我如何在scilab的循环中创建变量Ai,其中i=1.10
我正在使用Scilab.基本上,我想要这个人在循环中创建'n'矩阵 或这个家伙/CSSM/matlab-faq_4.html#evalcell 答案在Scilab中没有起作用,我无法在Scilab中进行操作.有人可以帮我吗? 解决方案 如果我正确的意图,则要使用动态变量名称(=变量名称不是硬编码,而是在执行过程中生成).这是正确的吗? 正如其他人已经在链接的帖子中指出的那样(在其他许多地方,例如在这里),通常不建议这样做.最好使用向量或矩阵(2D或3D),如果您的变量具有相同的大小和类型,例如如果 A1=[1,2]; A2=[3,4]; 更好的方法: A(1,1:2)=[1,2]; A(2,1:2)=[3,4]; 这样,您可以将变量存储在更有效的矩阵表单中,该变量更快地执行(循环缓慢!),并且通常作为自变量更灵活(您可以定义它们的某个子集,并执行矩阵操作,等等. ) 但是,如果您真的想这样做,请使用execstr: clear; //
0 2023-03-14
编程技术问答社区
更快的投射规范(二次型、公转矩阵...)式计算
我需要对表格进行大量评估 X(:,i)' * A * X(:,i) i = 1...n 其中x(:,i)是向量,a是对称矩阵.表面上,我可以在循环中进行此操作 for i=1:n z(i) = X(:,i)' * A * X(:,i) end 是慢的,或将其矢量为 z = diag(X' * A * X) 当X具有很多列时,它会无法接受.目前,我在 上妥协 Y = A * X for i=1:n z(i) = Y(:,i)' * X(:,i) end 这更快/更轻,但似乎并不令人满意. 我希望可能有一些Matlab/scilab习语或技巧可以更有效地实现此结果? 解决方案 在MATLAB中尝试一下: z = sum(X.*(A*X)); 这给出了结果等于 dot dot ,但是应运行速度稍快.这是因为 sum 相同的方式功能.但是, dot dot 也有其他输入参数检查和其他输入参数检查和对于要处理复数的情
4 2023-03-05
编程技术问答社区
如果两种语言都遵循IEEE 754,两种语言的计算结果是否相同?
我正在将程序从SCILAB代码转换为C ++.尤其是一个循环是与原始Scilab代码产生的结果略有不同(这是一条很长的代码,所以我不会将其包括在问题中,但我会尽力总结以下问题). 问题是,循环的每个步骤都使用上一步中的计算.此外,计算之间的差异仅在第100,000次迭代左右(大约300,000). . 注意:我将C ++程序的输出与SCILAB 5.5.2的输出进行比较,使用"格式(25)";命令.这意味着我要比较25个重要数字.我还想指出,我了解在一定数量的位后无法保证精确度,但是在评论之前请阅读以下部分.到目前为止,所有计算在两种语言之间最多25位数字. 试图解决这个问题的底部,到目前为止,我尝试过: 检查所使用的数据类型: 我已经设法确认Scilab正在使用IEEE 754双打(根据语言文档).另外,根据Wikipedia的说法,C ++ 不是使用IEEE 754进行双打所需的,但是据我所知,我在C ++中使用double的任何地方都具有完美匹配Scil
16 2023-02-27
编程技术问答社区