我遇到了问题,我必须在Matlab中访问单元格的内容。但它不是一个普通的细胞。细胞中可能有一个细胞。我不知道第一个细胞有多少个水平。
所有单元格都具有维度(1,x)
所以可能
mycell{cell1{cell11{char1, char2}}, char3, cell2{char4, char5, char6}}
我必须得到char变量,我必须知道它们在哪里。
当我这样做时,会返回这种类型的单元格
get_param(path_to_busselector, 'Inputsignals')
path_to_busselector是Simulink中总线选择器的路径。
我可以硬编码,但是我只能处理固定数量的单元级别,这是一个问题。
我的想法是,我用while循环构造一些东西,可能还有eval命令。
这里我有一个示例模型Matlab example model和一个提供信号名称的skript。如果您运行命令signalnames = get_param(BlockPaths(Cellofbusselector))
,那么就有一个像我一样的单元格。现在我想访问总线选择器中的信号,但我不想手动执行此操作。如果我想在skript中访问信号,我必须知道信号的完整名称。这是清楚的还是我无法告诉我想要什么。对不起,如果第二个陈述是真的,我会再试一次
所以在我得到信号的名称之后我可以做这样的事情
set_param(outporthandle_of_busselector, 'Outport', fullsignalname)
为此,我必须知道确切的信号名称。
感谢您的时间和想法
答案 0 :(得分:0)
我找到了解决方案。它不是很好,但它确实有效。
所有文件都可以下载here from dropbox
抱歉,我本来希望发布图片,但我没有10个声誉。所以你必须从上面的链接下载它。
这是主要的skript,更进一步的是recursif函数。 skript也适用于所有其他带有公共汽车的Simulin车型。但是刚才它只是工作,如果只有一个总线选择器。但是,为多个总线系统和总线选择器编程并不多。
% Name_Signals_after_Blocknames
format compact, clear all, clc
cd(''); % Directory where the simulink model is safed
Simulink_Model = ('linearGuide_model.slx');
Simulink_Model = ('Verbindung.slx');
Simulink_Model = ('bus_system.slx');
% Simulink_Model = ('singlebus.slx');
[path, Model_name, ext] = fileparts(Simulink_Model);
BlockPaths = find_system(Model_name,'LookUnderMasks', 'all' ,'Type','Block');
length_Model_name = length(Model_name);
Cellofbusselector = [];
jj = 0;
for ii = 1:length(BlockPaths)
disp(BlockPaths{ii})
porthandles = get_param(BlockPaths{ii}, 'PortHandles');
outporthandles = get_param(porthandles.Outport, 'Line');
Block_Name = BlockPaths{ii};
% if length(outporthandles) > 1 % only give names to outputs of a subsystem, they are also listed in the BlockPaths cell
% warning ('more than one signal wants to get the same name, might be a Subsystem')
% else
if strcmp(BlockPaths{ii}(end-7:end), 'Selector') % you can not change the name of a line connecting a Bus Selector
disp('Here we have a Bus selector')
jj = 1+jj;
Cellofbusselector(jj) = ii;
else
if isempty(outporthandles)
warning(['Block ', Block_Name, ' has no Output'] )
elseif length(outporthandles) == 1
if outporthandles == -1 % outporthanldes == 1, when there is no signal attachet to the outport of the block
warning(['Block ', Block_Name, ' has no Output-Signal attached'] )
else
Signal_name = BlockPaths{ii}((length_Model_name+2):end);
set_param(outporthandles, 'Name', Signal_name);
end
elseif length(outporthandles) > 1
for jj = 1:length(outporthandles)
if outporthandles{jj} == -1 % outporthanldes == 1, when there is no signal attachet to the outport of the block
Block_Name = BlockPaths{ii};
warning(['Block ', Block_Name, ' has no Output-Signal attached'] )
else
Signal_name = [BlockPaths{ii}((length_Model_name+2):end), '_out', num2str(jj)];
set_param(outporthandles{jj}, 'Name', Signal_name);
end
end
end
end
% end
end % for ii = 1:length(BlockPaths)
buscell = get_param(BlockPaths{Cellofbusselector}, 'InputSignals');
[signalname, buslevel, numofsig, busname] = f_get_complete_signalnames(buscell)
%%
signalnamesize = size(signalname);
for ii = 1:signalnamesize(1)
for kk = 1:signalnamesize(2)
if isempty(signalname{ii,kk})
else
nrofbusnames = kk-1;
fullbusname = '';
for i = 1:nrofbusnames
fullbusname = [fullbusname '.' busname{i}];
end
fullsignames{ii,1} = [fullbusname(2:end) '.' signalname{ii,kk}]
end
end
end
以下是recursiv函数的代码
function [signalname, buslevel, numofsig, busname] = f_get_complete_signalnames(buscell, buslevel, numofsig, signalname, busname)
%% Description
% This function returns the complete signal names which are stored in a
% bus. The name looks something like bus1.bus2.signal1.
if nargin < 2; buslevel = 1; end
if nargin < 3; numofsig = 0; end
if nargin < 4; signalname = {}; end
if nargin < 5; busname = {}; end
buscellsize = size(buscell);
buscellsize(1); % busvert is the vertical dimension of buscell
for kk = 1:buscellsize(1)
if ischar(buscell{kk,1}) && buscellsize(2) == 1
numofsig = numofsig + 1;
signalname{numofsig, buslevel} = buscell{kk,1};
elseif ischar(buscell{kk,1}) && buscellsize(2) == 2
busname{buslevel-1} = buscell{kk,1};
[signalname, buslevel, numofsig, busname] = f_get_complete_signalnames(buscell{kk,2}, buslevel, numofsig, signalname, busname);
elseif iscell(buscell{kk,1}) && buscellsize(2) == 1
buslevel = buslevel+1;
[signalname, buslevel, numofsig, busname] = f_get_complete_signalnames(buscell{kk,1}, buslevel, numofsig, signalname, busname);
buslevel = buslevel-1;
end
end
end
我希望我做对了。这有助于某人。