1

「first_data*」と「second_data」という 2 つの非常に長い 2D リストがあり、等しい要素を見つけてリスト「final_data」に配置したいと考えています。ここに MWE があります。

first_data  = [1 2; 3 4]';
second_data = [1 2; 9 4]';


final = [];
for i=1:length(first_data(:, 1))
    for j=1:length(second_data(:, 1))
        if(first_data(i, 2) == second_data(j, 2))
            final = [final first_data(i, 1)];
        end
    end
end

これにより、必要に応じて2が得られます。これは機能しますが、非常に大きなデータ セットの場合、非常に計算量が多くなります。上記のコードをより効率的に記述する方法はありますか?

4

4 に答える 4

1

このコードを試してください:

first_data  = [1 2; 3 4]';
second_data = [1 2; 9 4]';
diff_data=first_data-second_data;
Ind=find(diff_data==0);
final=first_data(Ind);
于 2013-02-24T14:35:07.467 に答える
1

ismemberやりたいことができるようになります。

%# identify the rows in first_data's second column
%# that occur in second_data's second column
goodIdx = ismember(first_data(:,2),second_data(:,2));

%# return the corresponding values of first_data's first column
final = first_data(goodIdx,1);
于 2013-02-24T13:58:58.453 に答える
0

では、2つのデータセットは、次のタプルで完全に記述できますか?

-で記述された「first_data」は(i,j,data_1)、値data_1が行i、列jにあることを示します

によって記述された「second_data」(i,j,data_2)

そして、あなたは等しいそのようなタプルを見つけたいですか?

ブルームフィルターを使用して、「first_data」と「second_data」をセットに変換します

「first_data」と「second_data」のブルームフィルター表現を使用して集合交差を実行し、2つの表現のビットごとのANDを使用して本質的に一定の時間集合交差を取得します。

于 2013-02-24T14:44:16.570 に答える
0

使用する:

[c, ia, ib] = intersect(first_data(:, 2), second_data(:, 2));
final = second_data(ib,1);

注:これはテストしていませんが、動作するはずです(少なくとも行/列の混同まで)

于 2013-02-24T13:57:53.590 に答える