2

これは私が実行したいかなり単純なタスクですが、それを実行する方法を理解できないようです。私はsortrows、reshapeing、および他の解決策を試しましたが、それらのどれも私が望むものを正確に実行しません。

基本的に、同じ範囲の値から、長さが等しくない2つのベクトルがあります。値の中には等しいものとそうでないものがあります。例えば

A = [1 5 20 30 53 70 92]
B = [2 3 4 16 20 30 60 95 100]

私がやりたいのは、各ベクトルに「NaN」を追加して、共有されていない他のベクトルの値を「代用」することです。だから、私はそれらを次のように見せたいです:

A = [1 NaN NaN NaN 5 NaN 20 30 53 NaN 70 92 NaN NaN]
B = [NaN 2 3 4 NaN 16 20 30 NaN 60 NaN NaN 95 100]

ベクトルが他のベクトルの値のプレースホルダーを持つ方法。

ベクトルを組み合わせて並べ替えてから、他のベクトルのすべての値を検索してNaNに置き換えますか?不可能ではありませんが、それは少し不格好な解決策のように思えます。私が欠けているこれを達成するためのよりエレガントな方法があるように感じます。

ありがとう!

4

2 に答える 2

4

以下は、単純なマップを使用した 1 つのソリューションです。

A = [1 5 20 30 53 70 92]
B = [2 3 4 16 20 30 60 95 100]

% map all A and B elements
% use 1 for A and 2 for B
map = zeros(max([A,B]),1);
map(A) = 1;
map(B) = bitor(map(B), 2);

% find the values present in either A, or B
[~,~,j] = find(map);
AA = nan(size(j));
BB = nan(size(j));
AA(bitand(j,1)~=0) = A;
BB(bitand(j,2)~=0) = B;

Rodys のソリューションと比較すると、この方法の方が少し速いことがわかります。

A = unique(randi(10000, 1000, 1));
B = unique(randi(10000, 1000, 1));

tic;
for i=1:1000
    map=zeros(10000,1);
    map(A) = 1;
    map(B) = bitor(map(B), 2);
    [~,~,j] = find(map);
    AA = nan(size(j));
    BB = nan(size(j));
    AA(bitand(j,1)~=0) = A;
    BB(bitand(j,2)~=0) = B;
end
toc


tic
for i=1:1000
    C = union(A,B);
    Ap = NaN(size(C));   
    Ap(ismember(C,A)) = A;
    Bp = NaN(size(C));   
    Bp(ismember(C,B)) = B;
end
toc

isequalwithequalnans(BB, Bp)
isequalwithequalnans(AA, Ap)

Elapsed time is 0.283828 seconds.
Elapsed time is 0.457204 seconds.

ans =
 1

ans =
 1
于 2012-12-06T16:03:04.057 に答える
3

さて、ここに1つの方法があります:

% union of sets A and B
C = union(A,B);

% initialize new sets, check membership, and 
% assign old values when applicable
Ap = NaN(size(C));   Ap(ismember(C,A)) = A;
Bp = NaN(size(C));   Bp(ismember(C,B)) = B;

union繰り返しを取り除くことに注意してください。すべての繰り返しを保持したい場合は、マニュアルsortと の 2 番目の出力を使用しismemberます。

% combine and sort, KEEPING repetitions
C = sort([A B]);

% initialize new sets, check membership, and 
% assign old values when applicable
Ap = NaN(size(C));         Bp = NaN(size(C));  
[I,Ab] = ismember(C,A);    [I,Bb] = ismember(C,B);
Ap(I) = A(Ab(I));          Bp(I) = B(Bb(I));
于 2012-12-06T16:02:09.150 に答える