据我所知,stateflow和simulink经常同时使用,并且都是MathWorks开发的环境,他们制作了Matlab.我可以知道它们之间有什么区别吗?
在MATLAB中迭代结构数据类型的常用方法是使用以下fieldnames()函数:
mystruct = struct('a',3,'b',5,'c',9);
fields = fieldnames(mystruct);
for i=1:numel(fields)
mystruct.(fields{i});
end
Run Code Online (Sandbox Code Playgroud)
不幸的是,这总是生成单元格数据类型,我想在SIMULINK中使用这种迭代来进行Matlab功能块,因为代码生成原因不允许单元格数据类型.
有没有办法在不同时使用单元数据类型的情况下迭代结构?
在Octave中有一种简洁的方法,在https://www.gnu.org/software/octave/doc/interpreter/Looping-Over-Structure-Elements.html中有解释.
for [val, key] = mystruct
# do something esp. with 'key'
end
Run Code Online (Sandbox Code Playgroud)
有没有人在MATLAB中知道类似的方法?
我有一个复杂的MATLAB-Simulink项目,涉及许多m文件和mdl文件.一些m文件定义了在其他m文件中使用的变量(糟糕的设计,我知道,但它是遗留代码).还有一些功能不再使用.
我需要一种自动方式来查找未使用的变量和函数,以便我可以删除它们并使整个事情变得不那么复杂.理想情况下,我应该有一个脚本/工具,它将项目根目录的名称作为输入,扫描子目录中的所有文件,并输出所有未在任何m文件或mdl文件中使用的变量和函数.
我知道我可以找到mdl文件中没有使用的变量(参见提示和技巧 - 在Simulink模型中跟踪变量).我想将该方法应用于项目中的所有文件.
我的工作场所使用MATLAB和子产品Simulink,Realtime workshop(RTW),RTW Embedded Coder.我们有一个大型的simulink模型,它被编译成C然后到一个目标文件,以便加载到嵌入式目标上.整个编译过程需要大约3小时,这很长,主要是从simulink模型生成的C文件的编译和链接.
删除一个特定子系统会将编译时间缩短到30分钟,并且由于此子系统不会经常更改,我计划在C中编码,然后在MEX中编码,并在主模型中使用MEX文件.
该技术会缩短编译时间吗?我应该研究另一种技术吗?
编辑:我认为解决方案将是粗略的:从违规子系统生成C将此编译为某种对象,库将其包含在模型中(但我对模拟不感兴趣,它只有输入)在构建中包含此内容进程,可能是在编译其余代码后进行链接
是否可以在任何编程语言中注释掉Simulink中的块?我的意思是,使用逻辑,我可以禁用块.但它并不是最好的解决方案.
我宁愿禁用/注释掉我模型中块的一部分来测试Simulink中的各个模块.
任何提示都将受到高度赞赏.
谢谢
我想使用Simulink为Arduino Uno硬件创建程序.但我想使用现有的库,如liquidcrystal,来处理LCD显示器的输出.如何创建包含liquidcrystal类文件的s函数?
我认为s函数是要走的路,因为现有的Simulink Arduino库块实际上是被屏蔽的s函数.我使用的是Simulink学生版,所以我认为我不能从模型中编译C代码并将其合并到Arduino IDE中的项目中.
我最近正在研究一种Simulink模型,正在使用Goto和From阻止一个非常繁忙的系统变成一堆扭曲的电线.我被告知我不会使用Goto和From阻止,因为他们被认为是不好的风格(至少,根据我的雇主).
虽然我认为应尽可能保持电线连接,但我相信,如果模型会产生大量交叉线Goto,那么From块和块可以显着提高系统/子系统的可读性; 特别是如果块可以用颜色编码(例如紫色Goto块到达所有紫色From块).
我提供了一个我正在使用的子系统的图像,但我不确定我可以把它放在这里.子系统本身有大约12个子系统块(可能更晚),每个子系统块有两个总线型输出.每个子系统的第一个输出转到一个Bus Creator块,每个子系统的第二个输出转到第二个Bus Creator块.由于子系统垂直对齐而Bus Creators位于右侧,因此会产生许多交叉线.我正在使用Goto和From阻止清理系统.
我可以提供一个较小但相似模型的图像,我将这个问题放在一起.
对于大约12个子系统的系统,这变得非常繁忙.我正在使用Goto和From阻止连接子系统和Bus Creators而没有过多的交叉线.
我相信我的雇主可能会承担使用goto基于文本的语言的语句并将其应用于Simulink中的Goto/ From块的耻辱.一般来说,使用Goto和From阻止这种方式(或任何方式)被认为是不好的风格?
我使用Matlab脚本运行蒙特卡罗模拟Simulink模型,该脚本看起来或多或少像这样:
model = 'modelName';
load_system(model)
for ii = 1 : numberOfMC
% Some set_param...
% Some values are set
sim(model);
results{ii, 1} = numberOfMC;
% ect...
end
close_system(model,0);
Run Code Online (Sandbox Code Playgroud)
随着蒙特卡罗试验次数的增加,一次模拟的时间也随着n ^ 2的增加而增加.
有没有一个简单的解释,是否有解决方案,以及时间线性?
谢谢!
编辑:
当我将模拟分成6批,并且我将它们串联运行时,模拟时间的总和远小于我在一次运行整个模拟时的总和.
假设我有以下两个变量:
start_idx = [1 4 7];
end_idx = [2 6 15];
Run Code Online (Sandbox Code Playgroud)
我想有效地(无for循环如果可能的话)产生的单排它由操作者结肠中的相应元件之间施加start_idx和end_idx.对于此示例,这将导致:
result = [1:2 4:6 7:15];
Run Code Online (Sandbox Code Playgroud)
因此:
results = [1 2 4 5 6 7 8 9 10 11 12 13 14 15];
Run Code Online (Sandbox Code Playgroud)
执行此操作的方法应该可以在Simulink的MATLAB功能块中使用.非常感谢你!
如果我想在Matlab中绘制一个简单的正弦波的PSD,我会做如下的事情:
Fs = 1000;
t = 0:1/Fs:1-(1/Fs);
x = cos(2*pi*100*t) ;
N = length(x);
xdft = fft(x);
xdft = xdft(1:N/2+1);
psdx = (1/(Fs*N)) * abs(xdft).^2;
psdx(2:end-1) = 2*psdx(2:end-1);
freq = 0:Fs/length(x):Fs/2;
plot(freq,10*log10(psdx))
grid on
Run Code Online (Sandbox Code Playgroud)
但是,为简单起见,我在SIMULINK中有一个正弦波发生器,我需要绘制PSD.我做了类似以下的事情:

然后我得到了一个名为"Sinwave"的变量,我怎么可能应用上面的Matlab代码来绘制PSD?
请注意,变量Sinewave是1x1双倍时间序列.我试图用Sinwave替换x,但它没有用.
更新:应用答案
我应用了推荐的内容,但是我的输出与使用Matalb的输出不同.这是我使用的代码:
Fs = 1000;
x = Sinwave.Data;
N = length(x);
dft = fft(x);
dft = dft(1:N/2+1);
psd = (1/(Fs*N)) * abs(dft).^2;
psd(2:end-1) = 2*psd(2:end-1);
freq = 0:Fs/length(x):Fs/2;
plot(freq,10*log10(psd))
grid on
Run Code Online (Sandbox Code Playgroud)
我需要输出来自matalb ,在噪声层中具有所有这些涟漪.如何获得准确的输出?
请注意我已经使用了两者的确切值.
更新2:SIMULINK正弦波设置
1-正弦波块 …