2015-08-22 3 views
0

Как сравнить текущую итерацию в цикле с предыдущей?Сравните текущую итерацию с предыдущей, MATLAB

Например, я хочу видеть, является ли элемент в матрице, являющейся частью структуры, ниже, чем тот же самый элемент, но из предыдущей итерации (очевидно, это не те же значения, но то же самое элементы, просто разные итерации). Чтобы быть более ясным, мне нужно вызвать матричный элемент mystruct(h).field(j,1) и посмотреть, находится ли этот элемент ниже mystruct(h-1).field(j,1).

a=rand(20,1); 
field = 'field'; 
for h=1:20 
    value = 1.4*rand(20,1); 
    value1 = zeros(20,1); 
    mystruct(h) = struct(field,value); 
    NEWstruct(h) = struct(field,value1); 
end 

for j=1:20 
    if mystruct(1).field(j,1)<a(j,1) 
     NEWstruct(1).field(j,1)=mystruct(1).field(j,1); 
    else 
     NEWstruct(1).field(j,1)=a(j,1); 
    end 
end 

Теперь после этого я должен увидеть, если следующая итерация mystruct(2).field(j,1) ниже предыдущей итерации NEWstruct(1).field(j,1), и если он есть, присвоить это значение NEWstruct(2).field(j,1). Если это не так, то она должна быть равна mystruct(1).field(j,1)

+0

Пожалуйста, переформатируйте свой вопрос и опубликуйте минимальный пример. – thewaywewalk

+0

отметил и отредактировал – theKingDidier

ответ

0

В общем случае, вы можете использовать следующий массив:

field_data = cat(3,mystruct.field); 

greater = diff(field_data, [], 3)>0; 

Теперь greater является 3D-массив из 2D-массивов размером field и size(mystruct)-1 слоев. Каждый уровень соответствует изменению каждой итерации. Таким образом, у вас есть либо 1, если значение увеличилось, либо 0, если оно уменьшилось. Например, вы можете иметь что-то вроде этого:

field_data(:,:,1) = 

    0.0358 0.4735 0.6074 
    0.1759 0.1527 0.1917 
    0.7218 0.3411 0.7384 


field_data(:,:,2) = 

    0.2428 0.7655 0.0911 
    0.9174 0.1887 0.5762 
    0.2691 0.2875 0.6834 


field_data(:,:,3) = 

    0.5466 0.6476 0.9452 
    0.4257 0.6790 0.2089 
    0.6444 0.6358 0.7093 


greater(:,:,1) = 

    1  1  0 
    1  1  1 
    0  0  0 


greater(:,:,2) = 

    1  0  1 
    0  1  0 
    1  1  1 

С помощью этого массива вам нужно только проверить правильное значение для каждого возможного изменения.

В вашем конкретном случае, если все, что вы хотите, чтобы назначить минимальный min(mystuct(h-1).field(j),mystuct(h).field(j)) к NEWsctruct(h).field(j) вы можете просто перебрать все значения, добавив следующий код:

for h=2:length(mystruct) 
    for j=1:20 
     NEWstruct(h).field(j) = min(mystruct(h-1).field(j),mystruct(h).field(j)); 
    end 
end 

Или используя векторизованную форму:

field_data = cat(2,mystruct.field);   % Gather the whole data in a matrix 
minimum = min(field_data(:,2:end),field_data(:,1:end-1)); % Get the proper values (as a matrix) 
NEWstruct(2:end) = cell2struct(num2cell(minimum,1),field,1); % Assign the values to the struct 
+0

спасибо, что ответите @josoler. Я редактировал свой код, поэтому он не сравнивается с 0 все время. Теперь это сравнение с этим значением только для первой итерации. Теперь после этого я должен увидеть, будет ли следующая итерация 'mystruct (2) .field (j, 1)' меньше предыдущей итерации 'NEWstruct (1) .field (j, 1)', и если это так, назначьте ее значение к 'NEWstruct (2) .field (j, 1)'. Если это не так, то оно должно быть равно «mystruct (1) .field (j, 1)». Можно ли это сделать с помощью цикла if? – theKingDidier

+0

Я думал, что вы хотите сравнить 'mystruct (2) .field (j, 1)' с 'mystruct (1) .field (j, 1)', а не с 'NEWstruct (1) .field (j, 1)' , Чтобы быть ясным: вы хотите назначить 'NEWstruct (i) .field (j)' минимум двух чисел? В этом случае эти числа являются 'mystruct (i-1) .field (j)' и 'mystruct (i) .field (j)'? Обратите внимание, что, поскольку вы wowrking с векторами столбцов, 'field (j, 1)' то же самое, что 'поле (j)' – josoler

+0

Я отредактировал ответ в случае, если оба ответа на эти вопросы да. – josoler

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