工欲善其事必先利其器,要实现在MATLAB中直接调用Javascript函数,首先需要准备好一款可在当前系统中执行Javascript语言的工具,咱这里推荐大家使用Node.js (nodejs.org/en/),直接下载推荐的版本即可。
(本图来源于:nodejs.org首页截图)
在准备好node.js之后,接下来就是直接上硬菜了。为了方便伙伴迅速入门并适应,咱就直接边上代码边讲过程了。
首先,咱先定义咱们的函数模块,取名为circlefun.js并保存好。因为要使用node.js来调用模块里面的函数,因此程序结尾处需要使用module.exports来声明待导出的函数名称,否则可能导致函数无法被识别。
代码语言:javascript复制// 作者:巴山(bashan) 自媒体平台账号: 懂科学的程序员
// 欢迎关注订阅 -> 懂科学的程序员
// 定义圆周率常数,定义最前面有全局变量之功效
const pi = 3.1415926;
// 计算周长函数,注:JavaScript定义函数的形式多种多样,此为其中一种
function circumference(r) {
return 2*pi*r;
}
// 计算面积函数
function area(r) {
return pi*Math.pow(r,2);
}
// 计算体积函数
function volume(r) {
return 4*pi*Math.pow(r,3)/3.0;
}
// 导出函数模块,此处为必须添加,不然函数名称将不被识别
module.exports = {circumference, area, volume};
其次,准备接口程序main.js。为了将功能模块与预处理部分分开,咱在此处人为做了一个接口函数。如果不想用接口函数,则自行直接将以下内容整合到circlefun.js中即可。
代码语言:javascript复制// 作者:巴山(bashan) 自媒体平台账号: 懂科学的程序员
// 欢迎关注订阅 -> 懂科学的程序员
// 处理输入变量以及加载相应的函数模块
const args = process.argv.slice(2);
let circlefun = require("./circlefun.js");
// 声明变量
var flag = args[1],results;
// 根据不同输入选择调用circlefun.js中不同的模块
switch (flag) {
case "1": // 计算周长
results = circlefun.circumference(args[0]);
break;
case "2": // 计算面积
results = circlefun.area(args[0]);
break;
case "3": // 计算体积
results = circlefun.volume(args[0]);
break;
default:
results = circlefun.circumference(args[0]);
}
// 输出结果
console.log(results);
模块和接口准备好之后,接下来就是MATLAB的事情了。这里咱用system函数来作为执行node.js命令的工具,具体代码如下。需要注意的是node.js作为命令行命令时,是支持用户带参数输入的,具体的输入参数处理细节,请伙伴们自行参看node.js官方说明文档。
代码语言:javascript复制% 作者:巴山(bashan) 自媒体平台账号: 懂科学的程序员
% 欢迎关注订阅 -> 懂科学的程序员
% MATLAB与JavaScript联合编程案例
r = 2.5;
for k = 1:3
% 使用system命令调用node.js执行main.js脚本
[~, result] = system(['node main.js ' num2str(r),' ',num2str(k)]);
% 此处result为字符串,若要转换为数值请用str2double或str2num
switch(k)
case 1
disp(['半径为',num2str(r),'的圆的周长为:',result]);
case 2
disp(['半径为',num2str(r),'的圆的面积为:',result]);
case 3
disp(['半径为',num2str(r),'的圆的体积为:',result]);
end
end
执行效果图
今日分享到此就接近尾声了,希望本文没有浪费点进来看的伙伴们的时间,有任何相关问题,欢迎留言。
参考资料:
[1] mathworks.cn/help/matlab/ref/system.html
[2] nodejs.org
图片来源:由 Reimund Bertrams 在Pixabay上发布
如需转载,请在公众号中回复“转载”获取授权,如未经授权擅自搬运抄袭的,本公众号将保留一切追责权利!