-2

行列が 2 つあります。行列 {a} <252x1> は、行列 {b} <252x4000> のサブセットです。マトリックス {a} の値がマトリックス {b} で発生する前後の日数を特定する必要があります。

Example:

Matrix a  Matrix b
10       12 34 54 10
23       23 98 78 98
43       98 53 43 88
44       98 44 88 78

Output
1  1  1  10
23 1  1  1
1  1  43 1
1  44 1  1

Days
3 0
0 3
2 1
1 2
4

2 に答える 2

1

行ごとにain が1つだけ出現すると仮定します。b

bsxfunを使用して取得しますresult

result=ones(size(b));
ainb=bsxfun(@eq,a,b);
result(ainb)=b(ainb);

2 つの出力引数を指定してfindab使用して列インデックスを検索し、そこから日数を推測します。

[colidx_rev,~] = find(ainb);
colidx(colidx_rev,1) = 1:4;

Days = [colidx-1 size(b,2)-colidx];

の場合、行ごとに複数の一致があることがわかりますany(sum(ainb,2)>1)。次に行うことは、1 つを選択することです (たとえば、最初の一致)。これを行うには、ループを使用するか、arrayfun を使用して短い方法で、別の方法で列インデックスを見つけます。

col_idx = arrayfun(@(rowi) find(ainb(rowi,:),1),1:size(b,1))';

残りは似ています。

于 2012-07-31T13:48:42.123 に答える
1

この回答は、行ごとに 1 つの一致のみがあることを前提としています。

a = [10;23;43;44]
b = [12 34 45 10;23 98 78 98;98 53 43 88; 98 44 88 78]
l = bsxfun(@eq, a, b)
[c r] = find(l')
Days = [c - 1, size(b, 2) - c]
Output = b.*l + ~l

仮定が悪い場合は、ループを使用したほうがよいと思います。

于 2012-07-31T13:49:10.670 に答える