проблемы при создании таблицы блоков с помощью Matlab

#arrays #matlab #simulink

#массивы #matlab #simulink

Вопрос:

Я пытаюсь создать функцию, которая может создавать таблицу блоков, содержащую их дескриптор, полное имя, тип блока, родительский элемент, используя struct . Однако каждый раз, когда я вводил имя модели, в нем говорилось

 Error using struct
Field names must be non-empty character vectors or a string scalars.

Error in createBlockTable (line 10)
          tableStruct = struct(get(i), 'Name');
 

Вот мой код

 function blockTable = createBlockTable(modelName)
    load_system(modelName);

    getBlock = find_system(modelName, 'FindAll', 'on', 'FollowLinks', 'on', 'LookUnderMasks', 'all', 'Type', 'Block');
    
    blockCell = cell(1,length(getBlock));

    for n = 1:length(getBlock)
       for i = getBlock(n, 1)
          tableStruct = struct(get(i), 'Name');
       end
    end
    
    blockTable = assign(tableStruct, blockCell); 
end
 

Я действительно запутался в i = getBLock(n,1). Я думаю, что я просто что-то напутал в этой строке. Но я не знаю, как решить эту проблему. Пожалуйста, помогите, спасибо

ОБНОВЛЕНИЕ # 1
Через день мне удается решить эту проблему, но я не знаю, как поместить всю структуру в цикл for в пустую ячейку

 function blockTable = createBlockTable(modelName)
    load_system(modelName);

    getBlock = find_system(modelName, 'FindAll', 'on', 'FollowLinks', 'on', 'LookUnderMasks', 'all', 'Type', 'Block');
  
    blockCell = cell(1, length(getBlock));
    
    for n = 1:length(getBlock)
        structTable = struct('Handle', get(getBlock(n), 'Handle'), 'Name', get(getBlock(n), 'Name') );
    end 
        
end
 

Комментарии:

1. Вы пробовали ставить точку останова в этой строке, чтобы увидеть, что get(i) выводится? Согласно ошибке, я подозреваю, что это пустая строка, которую нельзя использовать в качестве имени поля структуры.

2. Я уже знаю, что get(i) не может работать, но я также использую get_param, но ничего не меняется

3. используйте get(i, 'Name') , или get_param(i, 'Name') . Назначение struct не будет работать, поскольку вам также необходимо присвоить значение structfield . Но вы можете собрать имена блоков в массив ячеек.

4. Я понимаю, но как добавить все имя в таблицу в blockCell

5. кроме того, ошибка при использовании преобразования структуры в struct из char невозможна.

Ответ №1:

через день я решил этот вопрос:

 copyModel = 'sldemo_fuelsys_copy';

blockTable = makeTable(copyModel);

save('blockTable.mat','blockTable');

function blockTable = makeTable(modelName)

    load_system(modelName);

    getBlock = find_system(modelName, 'FindAll', 'on', 'FollowLinks', 'on', 'LookUnderMasks', 'all', 'Type', 'Block');
  
    blockCell = cell(1, length(getBlock));
    
    for n = 1:length(getBlock)
    
        structTable = struct('Handle', get(getBlock(n), 'Handle'), 'Name', ... 
        get(getBlock(n), 'Name'), ...
        'Block_Type', get(getBlock(n), 'BlockType'), ...
        'Parent', get(getBlock(n), 'Parent') );
        
        blockCell{1, n} = structTable;
    
    end 
    
    blockTable = blockCell;

end
 

что касается моей проблемы, в основном я застрял в том, как создать strike для всех блоков в модели, так что я исправляю и использую для этого цикл for, а также присваиваю свою структуру ячейке, которая создается в начале этого кода.