Альтернатива `ismember` и` intersect` в Matlab для выполнения задачи сравнения? - PullRequest
1 голос
/ 09 февраля 2012

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

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, который может выполнять аналогичную функцию с несколькими переменными.

Спасибо.

1 Ответ

1 голос
/ 09 февраля 2012

Я смог решить проблему следующим образом:

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
...