MATLAB: длина поля структуры, представляющего собой список структур

#arrays #matlab #field #structure

#массивы #matlab #поле #структура

Вопрос:

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

То, что у меня есть, — это массив структур (MxN), созданный как

 first = struct('field1',0);
array = repmat(first,[MxN]); %now we have an array of structures
 

'field1' Я инициализировал 0 , потому что это поле для каждой структуры array(i,j) имеет переменную длину.. это означает, что я не знаю его длины заранее. Как только моя программа будет завершена, array(1,1).field1 появится поле структур, то же самое с array(1,2) , но список может быть или не быть одинаковой длины.

Есть ли способ, которым я могу вернуть длину списка структур в 'field1' ?

Ответ №1:

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

 array = repmat(struct('field1',0), [2 3]);
for i=1:size(array,1)
    for j=1:size(array,2)
        array(i,j).field1 = rand(randi([1 10]),1);
    end
end
 

Если это так, вот два способа получить длины:

 >> len = cellfun(@length, {array.field1})
len =
     3     8     9     4     1     7

>> len = arrayfun(@(s) length(s.field1), array)
len =
     3     9     1
     8     4     7
 

Редактировать:

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

 array = repmat(struct('field1',0),[1 2]);

array(1,1).field1.a = 1;
array(1,1).field1.b = 1;

array(1,2).field1.c = 2;

len = arrayfun(@(s) length(fieldnames(s.field1)), array)
 

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

1. поле 1 не содержит vector..it содержит переменное количество структур

2. из вашего вопроса неясно, что именно хранится в вашем массиве структур, пожалуйста, выполните следующее и вставьте результаты обратно сюда: a1 = array(1,1); a1f1 = a1.field1; whos array a1 a1f1

3. Name Size Bytes Class Attributes a1 1×1 134632 struct alf1 1×1 134456 struct array 10×5 5287864 struct`

4. вместо этого попробуйте следующее: arrayfun(@(s) length(fieldnames(s.field1)), array)