获取单元格的级别数

时间:2015-06-29 22:30:55

标签: matlab cell-array

我遇到了问题,我必须在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)

为此,我必须知道确切的信号名称。

感谢您的时间和想法

1 个答案:

答案 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

我希望我做对了。这有助于某人。