2015-02-22 3 views
4

У меня есть вектор структур каждый из которых имеет поле x:MATLAB векторизации: заполнение поля структуры из элементов вектора

s1.x = 1; 
s2.x = 2; 
s3.x = 3; 
S = [s1, s2, s3]; 

Я хотел бы установить поле x всех структуры в S от заданного вектора X, т.е. я хотел бы векторизовать следующий цикл:

X = [97, 98, 99]; 
for i = 1 : length(S) 
    S(i).x = X(i); 
end 

Возможно ли это?

ответ

0

Если вы знаете значения заранее, вы можете инициализировать так:

S = struct('x', {1 2 3}) 
+1

Хороший отзыв, но это не то, что мне нужно. 'S' уже существует, и я хочу заменить все поля' x' сразу из вектора 'X'. – MGA

4

Вы можете сделать это следующим образом:

Xc = num2cell(X); %// convert X to cell array of numbers 
[S.x] = Xc{:}; %// generate comma-separated list from cell array, and assign 

Для версии Matlab, прежде чем 7.0 второй линии should be changed в

[S.x] = deal(Xc{:}); %// generate comma-separated list from cell array, and assign 
+0

Отлично, это так! Не могли бы вы объяснить, почему это работает, а '[S.x] = X' нет? Иногда этот материал векторизации кажется мне немного похожим на вуду. – MGA

+1

Вы можете опустить «сделку», если мы имеем дело с массивами ячеек, поэтому просто сделайте это так: '[Sx] = Xc {:};' – rayryeng

+2

@MGA: X - вектор, а 'Xc {:}' - список, разделенный запятыми. Просто переходите к другой структуре данных между ними, чтобы сделать это. @Luis Mendo: «сделка» может быть удалена, чтобы получить еще более короткое решение. – Daniel

Смежные вопросы