2012-02-08 5 views
1

У меня есть 100 моделей (матриц), размер каждой матрицы которых равен 4X3. Каждая из четырех переменных R_L, N_g, N_Pc и uT имеют размер 4x3x100, где 4X3 - размер каждой матрицы и 100 таких матриц. Я приложил снимок двух переменных, чтобы дать представление о том, что я имею в виду:Альтернатива `ismember` и` intersect` в Matlab для выполнения задачи сравнения?

enter image description here

Я зацикливание через матрицу 1 первых трех переменных (т.е. R_L, N_g, N_Pc) и сравнивая каждый элемент в матрице 1 из этих переменных с элементами в других 99 матрицах. Я хочу найти те элементы, где все три переменные в этих 99 матрицах равны соответствующим трем переменным в любом элементе матрицы 1.

Например, если все три переменных в элементе (1,1) матрицы 1 имеют соответственно аналогичные значения в элементе (2,2) матрицы 2, (2,1) матрицы 3, (2,4) матрицы 3 и т. д., тогда я выберу результаты из переменной 4 (т. е. uT) во всех вышеперечисленных элементах позиции (1,1) матрицы 1, (2,2) матрицы 2, (2,1) матрицы 3, (2,4) матрицы 3 и т. д. от uT и сохранить эти результаты в новой переменной под названием store_result для построения его гистограммы. Это показано в коде ниже.

nModel=100; 
ixk=1; 
% looping inside model # 1 
for k_model1=size(R_L,1):-1:1 
    for i_model1=1:size(R_L,2) 

     % comparing values in model 1 to values in model 2 to nModel 
     for model_no=2:nModel 
      % looping inside each model from model # 2 to nModel 
      for k=size(R_L,1):-1:1 
       for i=1:size(R_L,2) 
        if ismember(R_L(k_model1,i_model1,1), R_L(k,i,model_no)) &&... 
          ismember(N_g(k_model1,i_model1,1), N_g(k,i,model_no)) &&... 
          ismember(N_Pc(k_model1,i_model1,1), N_Pc(k,i,model_no)) 
         index_for_identical_results(:,:,model_no)=intersect(ismember(R_L(k_model1,i_model1,1), R_L(k,i,model_no)),... 
          ismember(N_g(k_model1,i_model1,1), N_g(k,i,model_no)),... 
          ismember(N_Pc(k_model1,i_model1,1), N_Pc(k,i,model_no))); 

        end 
       end 
      end 
     end 
     store_result(:,ixk)=uT(index_for_identical_results(:,:,model_no)); 
     ixk=ixk+1; 
    end 
end 

я следующие проблемы, которые я хотел бы решить:

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

  2. Поскольку я хочу найти сетку (элемент), где все три переменные равны, поэтому функция intersect здесь не работает (хотя я и использовал в приведенном выше коде). Что вы предложите использовать вместо intersect, который может выполнять аналогичную функцию с несколькими переменными.

Спасибо.

+0

Я смущен алгоритмом. Но член является определенно плохим выбором - интервал - хорошая идея. Я также могу указать, как вы сохраняете результаты, будет проблематично, если количество записей в идентичных_выходах не всегда одинаково. Может быть, вы имеете в виду, что вся матрица должна быть одинаковой. В этом случае эффективная проверка будет заключаться в том, чтобы вычесть их и посмотреть на разницу. – bdecaf

ответ

1

я был в состоянии решить эту проблему следующим образом:

error=0.1; 
ixk=1; 
% looping inside model # 1 
for k_model1=size(R_L,1):-1:1 
    for i_model1=1:size(R_L,2) 
     count=1; 

     % comparing values in model 1 to values in model 2 to nModel 
     for model_no=2:nModel 
      % looping inside each model from model # 2 to nModel 
      for k=size(R_L,1):-1:1 
       for i=1:size(R_L,2) 
        if abs((R_L(k_model1,i_model1,1)-R_L(k,i,model_no))/R_L(k_model1,i_model1,1))<=error... 
          && abs((N_g(k_model1,i_model1,1)-N_g(k,i,model_no))/N_g(k_model1,i_model1,1))<=error &&... 
          abs((N_Pc(k_model1,i_model1,1)-N_Pc(k,i,model_no))/N_Pc(k_model1,i_model1,1))<=error 
         %       index_for_identical_results(:,:,model_no)= 
         if count==1 && ixk==1 
          store_result(1:2,ixk)=vertcat(uT_mpersec_end_of_window(k_model1,i_model1,1),uT_mpersec_end_of_window(k,i,model_no)); 
          count=count+2; 
         elseif count==1 && ixk~=1 
          store_result(1:2,ixk)=vertcat(uT_mpersec_end_of_window(k_model1,i_model1,1),uT_mpersec_end_of_window(k,i,model_no)); 
          count=count+2; 
         else 
          store_result(count,ixk)=uT_mpersec_end_of_window(k,i,model_no); 
          count=count+1; 
         end 
        end 
       end 
      end 
     end 
     ixk=ixk+1; 
    end 
end 
Смежные вопросы