0
A =[1;2;3;4;5]
B= [10 1 ;11 2;19 5]

私は手に入れたい

D = [1 10 ;2 11; 3 -9; 4 -9; 5 19]

つまり、A の何かが B(:,2) に存在しない場合、D の 2 列目は -9 になります。

Aの何かがB(:,2)に存在する場合、Bの1列目の対応する行をDの2列目に入れたい.

ismember と for と if を組み合わせて行う方法を知っています。しかし、高速化するために「for」を使用しない、より洗練された方法が必要です。

4

4 に答える 4

4

何か不足している (またはAインデックスのベクトルではない) 場合を除き、これは実際にははるかに単純であり、直接インデックスを作成する必要がないismemberか、まったく必要ありません。find

D = [A zeros(length(A),1)-9];
D(B(:,2),2) = B(:,1)

あなたの例の行列について

D =

    1    10
    2    11
    3    -9
    4    -9
    5    19
于 2013-07-26T14:33:59.043 に答える
2

一般用A

A =[1;2;3;4;6]; % Note change in A
B= [10 1 ;11 2;19 5];

[aux, where] = ismember(A,B(:,2));
b_where = find(where>0);
D = [(1:length(A)).' repmat(-9,length(A),1)];
D(b_where,2) = B(where(b_where),1);

これは与える

D = [ 1    10
      2    11
      3    -9
      4    -9
      5    -9 ]
于 2013-07-26T14:36:49.390 に答える
1

I am not sure how efficient this solution is, but it avoids using any loops so at least it would be a place to start:

D = [A -9*ones(size(A))];           % initialize your result
[tf, idx] = ismember(A, B(:,2));    % get indices of matching elements
idx(idx==0) = [];                   % trim the zeros
D(find(tf),2) = B(idx,1);           % set the matching entries in D to the appropriate entries in B

disp(E)

You allocate your matrix ahead of time to save time later on (building up matrices dynamically is really slow in MATLAB). The ismember call is returning the true-false vector tf showing which elements of A correspond to something in B, as well as the associated index of what they correspond to in idx. The problem with idx is that it contains a zero any time ft is zero, which is why we have the line idx(idx==0) = []; to clear out these zeros. Finally, find(tf) is used to get the indices associated with a match on the destination (rows of D in this case), and we set the values at those indices equal to the corresponding value in B that we want.

于 2013-07-26T14:28:15.533 に答える
0

最初に一時的なマトリックスを作成します。

tmp=[B; -9*ones(size(A(~ismember(A,B)))), A(~ismember(A,B))]
tmp =    
    10     1
    11     2
    19     5
    -9     3
    -9     4

次に、 を使用して、 の 2 列目のfind要素と一致する最初の行のインデックスを取得します(設計上、常に一致します)。Atmp

D=[A, arrayfun(@(x) tmp(find(tmp(:,2)==x,1,'first'),1),A)];
D =    
     1    10
     2    11
     3    -9
     4    -9
     5    19

tmp2 番目のステップの代わりに、2番目の列に基づいて単純に並べ替えることができます。

[~,I]=sort(tmp(:,2));
D=[tmp(I,2), tmp(I,1)]
D =
    1    10
    2    11
    3    -9
    4    -9
    5    19
于 2013-07-26T14:09:43.430 に答える