1

2 つのセル配列 R と C (R(n 要素)、C(m 要素) の 2 つのベクトル) があり、R の各要素を R の各要素と比較し、C の各要素を各要素と比較します。 C. 比較とは、2 つのセルの交点を見つけることです。その結果、2 つの行列を取得したいと考えています。R nxn に対する 1 つの行列 Q で、セル Q(i,j) は 2 つの要素 R(i) と R(j) の交点であり、C mxm に対する 2 番目の行列 P であり、セル P(i,j) は次の交点です。 2 つの要素 C(i) および C(j)。通常、2 つの for ループを使用してこれを行うことができますが、私のデータは非常に大きく、計算を高速化する方法はあるのでしょうか? 最初のアイデアは、セル配列を置き換えることでした。各セルには、比較したい行 (ベクトル R) または列 (ベクトル C) のインデックスがあります (バイナリ行列 BM の行と列、BM は入力データです)。そうならR(1) = {2 3 4}、BM が 5x5 の場合、R(1,:)=[0 1 1 1 0]. このバイナリ行列 RI を使用すると、1 つのループだけで各行を各行と比較できます。しかし、それでも行数に戻る必要があります。

R(1,:) = [0 1 1 1 0];
R(2,:) = [0 1 1 0 0]; %then 
Q(1,2) = [0 1 1 0 0]; %(intersection of element R(1) and R(2)) and

C(1,:) = [1 1 0 0 0]; 
C(2,:) = [1 0 0 1 0]; %then
P(1,2) = [1 0 0 0 0]; % Now I want to obtain 
Results(i,j) = sum(BM(Q(1,2),P(1,2)))=sum(BM([2 3],[1]));

これに対処し、セル配列の 2 つのベクトルを 2 つのループなしで比較する方法はありますか?

4

1 に答える 1

1

Q( k, l )は numCols (例では 5) のベクトルであるため、2D 行列に格納することはできません。2D セル配列または 3D 行列のいずれかである必要がありますQQ

バイナリ マトリックスを直接使用してQ(行の交差) を取得します。

>> Q = bsxfun( @times, permute( BM, [1 3 2] ), permute( BM, [3 1 2] ) );

ここで、の - 番目の行と- 番目の行のQ( k, l, : )間の交点を保持します。 同じことが言えます:klBM
P

>> P = bsxfun( @times, permute( BM, [3 2 1] ), permute( BM, [2 3 1] ) );
于 2013-07-08T09:01:24.347 に答える