2

ちょっと変わった質問ですが、こちらで。(T11、T12、T21、および T22) を含むマトリックスがあります...

| T11 T12 |
| T21 T22 |

マトリックス内の 2 つの値を比較するとスカラー値を返す関数があります。と呼びましょうf(x,y)。そして、2つの値ごとにこの関数を実行したいので...

f(T11,T12), f(T11,T21), f(T11,T22),
f(T12,T21), f(T12,T22),
f(T21,T22)

これらの結果をベクトルに保存し、現在 6 つの要素を含んでいます

V1 = [f(T11,T12), f(T11,T21), f(T11,T22), f(T12,T21), f(T12,T22), f(T21,T22)]

私が今やりたいことは、f(x,y)どの 2 つの値に対応するかを調べることx,yです。したがって、ベクトルV1には次のような値が含まれます。

V1 = [12 14 54 23 86 3]

i=1したがって、V1 の最初のインデックス ( ) の値は 15 で に対応しf(T11,T12)、V1 の 3 番目のインデックス ( i=3) は 54 で に対応することがわかりますf(T11,T22)

ご不明な点がございましたら、お知らせください。f(x,y)リフレッシュするには、 の各値に対してに入力された元の値を特定できるようにしたいと考えていますV1。私はパターンを探してみましたが、これまでのところ何も思いつくことができませんでした.私が知っていた数学の束を忘れてしまいました.V1の指標とマトリックス。アイデアください!(ps関数の戻り値にインデックスを値とともに含めてみましたが、本当に面倒なので、派手な数学的な方法で行いたいと思います.

4

3 に答える 3

0

ああ、ここに行きます。ついにこのトリッキーな質問を解く方法にたどり着きました!! したがって、V1 = indexのインデックスが与えられた場合、マトリックスから元の値を見つけたいと思います。私がしたことは、行列のサイズを取得して、を(m,n)作成しrow=1, col=1、次に

for i = 1 to (m*n) 
    if index - (m*n) plus i is <= 0, then col=index
    stop
else
    index = index - mn + i
row = row + 1

これで、行列をaにフラット化でき、1 by m*n必要な2つの値はrowrow+col

于 2012-12-13T06:20:35.520 に答える
0

meshgridを使用して 2 つのインデックス マトリックスを作成することをお勧めします。

N = numel(T);
[ind1,ind2]=meshgrid(1:N);

>>ind1 =

   1   2   3   4
   1   2   3   4
   1   2   3   4
   1   2   3   4

>>ind2 =

   1   1   1   1
   2   2   2   2
   3   3   3   3
   4   4   4   4

次に、これらの厳密な上三角部分または下三角部分を使用して、 への線形インデックスを作成しTます。

selection = logical(tril(ones(N),-1)
ind1 = ind1(selection);
ind2 = ind2(selection);

>>ind1' = 
   [1 1 1 2 2 3]
>>ind2' = 
   [2 3 4 3 4 4]

だから今、あなたは簡単に行うことができます:

V1 = arrayfun(@f,T(ind1),T(ind2));

の値の T に行と列のインデックスが含まれるようになりましind1た。ind2V1

これらのコード行を段階的に実行し、中間変数を調べてすべての動作を確認することをお勧めします。

于 2012-12-13T08:41:08.237 に答える
0

関数 f(x,y) で使用するために行列 (A という名前で、m 行 n 列の次元があるとします) から要素を取り出す順序は、次を見ていた場合と同じです。ベクトル (m = 2、A(1,:) が行列 A の最初の行であると仮定します)

w = [ A(1,:) A(2,:)]

ベクトルの左端の要素を取得し、それをその右側のすべての要素と比較することによって (行列 A のエントリがどれも同じでないと仮定して) すべての組み合わせを取得します (左から右の順序で)。ベクトル w からサイズ 2 のすべての組み合わせを生成するまで続けます。I行列Aは次のように定義されました

A = [ 1 2; 3 4]

A のエントリのサイズ 2 の生成された組み合わせは次のようになります (組み合わせは次の行列 B の行として表されることに注意してください)

B = [1 2; 1 3; 1 4; 2 3; 2 4; 3 4]

行列 A には m*n 個のエントリがあることがわかっています (この場合は 4)。あなたの質問のベクトル V1 では、最初の (m*n - 1) エントリはすべて、f(x,y) への最初の入力としてベクトル w の最初の要素を持ち、次の (m*n - 2 ) エントリには、ベクトル w の 2 番目の要素が f(x,y) への最初の入力として含まれます。インデックスが V1 のインデックスと等しい場合、次のコードで答えが得られます。

p = 1
for i = (m*n - 1):-1:1
  for j = 1:i
    index = index - 1
    if (index == 0)
      disp('The following number is the position of x in vector w')
      disp(p)
      pw = p
      disp('The following number is the position of y in vector w')
      disp(p + j)
      qw = p + j
  p = p + 1

disp('The row of input x of f(x,y) in A is the following:')
disp(idivide(int32(pw - 1),n))
disp('The column of input x of f(x,y) in A is the following:')
disp(pw - (idivide(int32(pw - 1),n)*n))
disp('The row of input y of f(x,y) in A is the following:')
disp(idivide(int32(qw - 1),n))
disp('The column of input y of f(x,y) in A is the following:')
disp(qw - (idivide(int32(qw - 1),n)*n))
于 2012-12-18T01:27:27.967 に答える