小编Dan*_*hoa的帖子

在MATLAB中实现Java接口

我正在尝试编写一个MATLAB GUI,它使用XBee-API接口与Arduino上的XBee无线电进行通信.GUI主要进行数据收集和解析传入的数据包.

我想按开发人员指南addPacketListener定义(请参阅"接收数据包"一节)来等待数据包处理.在Java中,这是如何完成的:

xbee.addPacketListener(new PacketListener() {
    public void processResponse(XBeeResponse response) {
        // handle the response
    }
});
Run Code Online (Sandbox Code Playgroud)

在MATLAB中,我会做一个addlistener()并设置其回调来进行处理.

我对Java知之甚少,所以我想知道是否可以将processResponse代码设置为MATLAB:我可以做如下的事情:

function processResponse
    #% do response here
end 

>> xbee.addPacketListener(@processResponse)
Run Code Online (Sandbox Code Playgroud)

我不确定这是否完全合理; 基本上我想要完成的是一旦新的数据包可用于我的XBee(在Java中由其处理addPacketListener)就执行回调.

java matlab arduino

5
推荐指数
1
解决办法
1378
查看次数

我可以调整频谱轴频率吗?

所述用于MATLAB文档示例spectrogram函数给出了具有设置为在频率轴上的例子[0 500].我可以将其更改为类似的内容[0 100]吗?显然运行axis命令会为我做这个,但是这会调整最终结果并"炸毁"结果图,使其像素化.我基本上希望建立一个仅在0-100之间寻找频率的频谱图,而不是在建立频谱图后重新调整频率.

以下是该文档的示例:

T = 0:0.001:2;
X = chirp(T,0,1,150);
spectrogram(X,256,250,256,1E3,'yaxis');
Run Code Online (Sandbox Code Playgroud)

这产生以下结果: 线性啁啾谱图

低于350Hz的所有东西都是不需要的.有没有办法在构建频谱图时不包括350到500之间的所有内容,而不是在事后调整轴?

matlab spectrogram

5
推荐指数
1
解决办法
1万
查看次数

如何从Perl的system()开始获取进程的PID?

我正在编写一个Perl脚本,它使用不同的输入参数运行4个同时进行的相同进程(请参阅此处的背景- 我的其余部分在阅读之后会更有意义).

我正在调用一个生成数据的程序(XFOIL,再看上面的链接).我的这个程序的单核版本如下所示:

eval{
    local $SIG{ALRM} = sub{die "TIMEOUT"};
    alarm 250;
    system("xfoil <command_list >xfoil_output");
    alarm 0;
};

if ($@){
    # read the output log and run timeout stuff...
    system('killall xfoil') # Kill the hung XFOIL. now it's a zombie.
}
Run Code Online (Sandbox Code Playgroud)

从本质上讲,XFOIL应该只需要大约100秒的时间来运行 - 所以250秒之后程序就会挂起(大概是等待用户输入它永远不会得到).

现在的问题是,如果我在我的程序的多核版本中执行killall,我将杀死其他3个XFOIL实例,并且这些进程正在生成数据.所以我只需要杀死挂起的实例,这需要获得一个PID.

我不太了解叉子等等.从目前为止我所知道的,我会在我fork的子进程中运行一个exec('xfoil').但exec()的PID将不同于子进程的PID(或者是它?它是一个单独的进程,所以我假设它是,但我再也没有经验...),所以这当我想强行杀死这个过程时仍然没有帮助,因为我无论如何都不会有PID.我该怎么做呢?

非常感谢您的帮助!

perl system

4
推荐指数
1
解决办法
2624
查看次数

在Emacs中使用主要模式进入次要模式

这个问题可能与此问题重复,但我无法在我的emacs中正常使用以下内容.

mlint-mode每当我进入主模式时,我都会尝试进入次模式matlab-mode(两种模式都在SourceForge页面上可用).我的.emacs文件中有以下内容:

(add-hook 'matlab-mode-hook
      (function (lambda()
                  (mlint-mode))))
Run Code Online (Sandbox Code Playgroud)

这看起来像我上面链接的问题的答案.打开.m文件时,出现以下错误:

文件模式指定错误:(void-function mlint-mode)

mlint-mode当我打开.m文件时,有人可以协助我帮助我写正确的钩子吗?FWIW,我正在运行emacs 23.1.50.1.

emacs q

4
推荐指数
1
解决办法
2056
查看次数

MATLAB:使用inputParser和varargin

我有一个函数,我想通过参数传递varargin,并使用它inputParser来确保输入是理智的.有些论据是必需的,有些则不是.这是一个例子:

function myFunc(varargin)
    p = inputParser;
    p.addRequired(...
            'numStates', ...
                @(x) validateattributes(x, {'numeric'}, ...
                {'scalar', 'integer', 'positive'}));
        p.addRequired(...
            'numInps', ...
                @(x) validateattributes(x, {'numeric'}, ...
                {'scalar', 'integer', 'positive'}));
        p.addRequired(...
            'numOuts', ...
                @(x) validateattributes(x, {'numeric'}, ...
                {'scalar', 'integer', 'positive'}));
        p.addRequired(...
            'X0', ...
                @(x) validateattributes(x, {'numeric'}, ...
                {'vector'}));
        p.addOptional(...
            'freq', 10, ...
                @(x) validateattributes(x, {'numeric'}, ...
                {'scalar', 'integer', 'positive'}));
        p.addOptional(...
            'SimulinkVariables', struct(), ...
                @(x) isa(x, 'struct'));

    p.parse(varargin{:});

    %# do stuff with variables
end
Run Code Online (Sandbox Code Playgroud)

我希望能够传递如下参数; 只要有必要的那一对,那么哪一对传入就没关系.所以示例调用可能是:

myFunc('numStates', 4, 'numInps', 2, 'numOUts', …
Run Code Online (Sandbox Code Playgroud)

matlab

4
推荐指数
2
解决办法
6839
查看次数

Strcpy()会破坏Solaris中复制的字符串,但不会损坏Linux

我正在为一个类编写C代码.这个类要求我们的代码在学校服务器上编译和运行,这是一个sparc solaris机器.我正在运行Linux x64.

我有这条线要解析(这不是实际的代码,但输入我的程序):

while ( cond1 ){ 
Run Code Online (Sandbox Code Playgroud)

我需要将"while"和"cond1"捕获到单独的字符串中.我一直在用strtok()这个.在Linux中,以下行:

char *cond = NULL;
cond = (char *)malloc(sizeof(char));
memset(cond, 0, sizeof(char));
strcpy(cond, strtok(NULL, ": \t\(){")); //already got the "while" out of the line
Run Code Online (Sandbox Code Playgroud)

将正确捕获字符串"cond1".然而,在solaris机器上运行它,给我字符串"cone1".

请注意,在我的程序中的许多其他情况下,字符串正在被正确复制.(例如,"while")被正确捕获.

有谁知道这里发生了什么?

c solaris sparc strcpy

3
推荐指数
1
解决办法
784
查看次数

使用数字字符串快速填充单元格数组

我想构建一个字符串的单元格数组:{'x_1', 'x_2', ..., 'x_n'}.我知道n提前是什么.我可能会按如下方式构建此单元格数组:

for i = 1:n
    myCell{i} = sprintf('x_%d', i);
end
Run Code Online (Sandbox Code Playgroud)

是否有一种更优雅的方式来做到这一点,即单线?

matlab

3
推荐指数
1
解决办法
4284
查看次数

MATLAB - 避免循环根据其他向量的元素创建矩阵

假设我有x,y,z长度的向量n,m,l.我想Q使用这些向量的元素创建一个单元矩阵.天真地可以使用for循环:

for i = 1:n
    for j = 1:m
        for k = 1:l
            Q{i,j,k} = someFunction(x(i), y(j), z(k));
        end
     end
end
Run Code Online (Sandbox Code Playgroud)

每个元素Q都是一个向量.

有没有更优雅(可能更慢)的方式来做到这一点?

matlab

3
推荐指数
1
解决办法
909
查看次数

如何在 MATLAB 中正确实现工厂模式?

我正在编写一个程序,可以在其中从可用对象列表中进行选择Sensor;在选择和用户验证后,程序应实例化该Sensor.

下面的代码片段是我可能会天真地做的事情:

switch userInput
    case 'Sensor A' 
        s = SensorA; % subclass of Sensor

    case 'Sensor B'
        s = SensorB; % subclass of Sensor

    %...
end
Run Code Online (Sandbox Code Playgroud)

这里有一些明显的问题,但我遇到的最大问题是使其可扩展。我希望能够创建许多不同的Sensor子类(或让其他开发人员生成Sensor子类),而不必不断添加到此switch语句中。更一般地说,我想坚持开放/封闭原则。我应该能够有很多不同的Sensor子类。(我也想用uicontrol可用的内容填充弹出菜单Sensors,但是如果这个问题得到普遍解决,这可能会得到解决。)其他简单的解决方案,例如查看充满Sensor子类的文件夹也不能很好地工作,因为对象构造可能是每个子类都不同。

我相信我正在寻找使用工厂方法模式,但我不完全确定如何实现它。我可以将上面的代码片段放入一个单独的 中SensorFactory,但这只是移动了switch语句,这意味着扩展它需要修改它。

如何正确实现工厂方法模式,以便每次添加新子类时不需要修改工厂对象Sensor

oop matlab factory

3
推荐指数
1
解决办法
3152
查看次数

Matlab与Java的递归

我在Java中修改了一个递归函数,用于我的Stats类中的作业问题,看起来像这样:

public static int d (int k, int n) {
 if (n == 1) return 1;
 else if (n > k) return 0;
 else return n*d(k-1, n) + n*d(k-1,n-1);
}
Run Code Online (Sandbox Code Playgroud)

然后我将(20,8)插入此功能,并获得了998,925,952.然而,我的教授说这个答案是错误的,在重复思考我的代码之后,我决定在Matlab中尝试相同的事情:

function t = d(k,n)
  t = 0;
  if n == 1
    t = 1;
  elseif n > k
    t = 0;
  else
    t = n*d(k-1, n) + n*d(k-1, n-1);
  end
Run Code Online (Sandbox Code Playgroud)

显然,这个功能给了我正确的答案,上面的输入,6.1169*10 ^ 17.

这一直困扰着我,我完全不知道为什么两种看似相同的两种语言的程序会给我带来完全不同的结果.有人可以帮忙解释一下吗?

java recursion matlab

2
推荐指数
1
解决办法
253
查看次数

Simulink-以编程方式指定外部输入

我想以编程方式调整一些Simulink参数,即指定外部输入和初始状态。关于数据导入/导出的Mathworks帮助文档显示了如何以可视方式和程序方式进行操作。显然对于外部输入,我需要指定LoadExternalInputs'on'; 我想通过该链接覆盖默认的外部输入,通过ExternalInputto [myTimeVar, myInputVar]

尝试运行命令

sim('mySim', 'LoadExternalInputs', 'on', 'ExternalInput', [myTimeVar, myInputVar]);
Run Code Online (Sandbox Code Playgroud)

产生以下错误消息:

参数'ExternalInput'的block_diagram'mySim'中的设置无效

如果不应该在sim()呼叫中指定外部输入,应该在哪里进行?我对如何指定输入和状态感到很困惑。

matlab simulink

2
推荐指数
1
解决办法
2279
查看次数

emacs - 仅在主要模式下设置快捷键?

我想覆盖C-l并使用它M-x erase-buffer来模拟击球RET,只有当我在时m-shell-modeC-l应该是它的默认值,recenter-top-bottom,否则。我该怎么做?

emacs

2
推荐指数
1
解决办法
1291
查看次数

MATLAB - 获取属性所属的对象?

假设我有一个myClass < handle属性A.如果我创建一个实例myClass,比如说myObj,并传递myObj.A给一个函数,比如说function myFunc(val),是否可以在内部myFunc看到val传递给它的属性是myObj

编辑:对于上下文:

我正在编写一个API(在某种意义上)与我的研究实验室的Arduino硬件接口.首要类被称为Vehicle与性能PinManager < handle,TelemCollector < handle以及各种Device < handle秒.它还有方法来做像runMotor(),getAltitude()等等.我有一个方法TelemCollector.telemFetch(),它是一个定时器事件的回调; 我希望TelemCollector.telemFetch()能够访问Vehicle方法(即getAltitude()); 天真的我只会做Vehicle一个TelemCollector访问这些方法的属性.我希望不必这样做.

EDIT2:我正在尝试完成的示例代码片段:

classdef Vehicle < handle
    properties
        PinManager
        TelemCollector
        Devices
    end
    methods
        function obj = Vehicle(PM, TC, D)
            obj.TC = TelemCollector();
            obj.PM = PinManager();
            obj.Devices …
Run Code Online (Sandbox Code Playgroud)

oop matlab

0
推荐指数
1
解决办法
493
查看次数

标签 统计

matlab ×9

emacs ×2

java ×2

oop ×2

arduino ×1

c ×1

factory ×1

perl ×1

q ×1

recursion ×1

simulink ×1

solaris ×1

sparc ×1

spectrogram ×1

strcpy ×1

system ×1