#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)