Вам необходимо:
- Найдите порядок, в котором элементы одного массива структуры соответствуют другому, на основе значения
condition
.
- Скопировать каждое поле в
B(i)
в соответствующий элемент массива A
. Я предполагаю, что в B
больше полей, чем просто z
и condition
.
Шаг 1 может быть выполнен с использованием ismember
, второй выходной аргумент которого дает индексы в один массив, совпадающий с элементами другого. Мы предполагаем, что каждый элемент B
имеет соответствующий элемент в A
:
[~,I] = ismember({A.condition},{B.condition});
Обратите внимание, что {A.condition}
- это массив ячеек со всеми строками condition
. B(I)
- это массив структур B
, упорядоченный для соответствия A
.
Шаг 2 можно выполнить, как в ответе rahnema1 , который мы обобщаем здесь для копирования нескольких полей, используя цикл над именами полей и используя имена динамических полей :
fields = fieldnames(B);
fields = setdiff(fields,'condition'); % don't copy over this field
for ii = 1:numel(fields)
[A.(fields{ii})] = B(I).(fields{ii});
end
Тестирование:
A(1).condition = 'con1';
A(1).y = [1,1,1];
A(2).condition = 'con2';
A(2).y = [2,2];
A(3).condition = 'con3';
A(3).y = [3,3,3];
B(1).condition = 'con2';
B(1).z = 2;
B(1).x = 'b';
B(2).condition = 'con3';
B(2).z = 3;
B(2).x = 'c';
B(3).condition = 'con1';
B(3).z = 1;
B(3).x = 'a';
[~,I] = ismember({A.condition},{B.condition});
fields = fieldnames(B);
fields = setdiff(fields,'condition'); % don't copy over this field
for ii = 1:numel(fields)
[A.(fields{ii})] = B(I).(fields{ii});
end
Это дает следующую структуру A
:
>> A(1)
ans =
struct with fields:
condition: 'con1'
y: [1 1 1]
x: 'a'
z: 1
>> A(2)
ans =
struct with fields:
condition: 'con2'
y: [2 2]
x: 'b'
z: 2
>> A(3)
ans =
struct with fields:
condition: 'con3'
y: [3 3 3]
x: 'c'
z: 3