索引模式,确定函数输入matlab

时间:2012-12-13 03:28:47

标签: matlab

我有一个奇怪的问题,但是这里有。我有一个矩阵包含(T11,T12,T21和T22)......

| T11 T12 |
| T21 T22 |

我有一个函数,它会在比较矩阵中的两个值时返回一个标量值。让我们称之为f(x,y)。我想为每两个值运行此函数,所以我做...

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)对应哪两个x,y值。因此,向量V1将包含值,例如:

V1 = [12 14 54 23 86 3]

因此,您可以看到V1的第一个索引(i=1)的值为15,对应于f(T11,T12),并且V1的第三个索引(i=3)= 54,对应f(T11,T22)

如果有任何不清楚的地方,请告诉我。要刷新,我希望能够为f(x,y)中的每个值确定输入V1的原始值。我一直试图寻找模式,到目前为止一直无法想出任何东西,我忘记了一堆我曾经知道的数学...我认为V1的指标和指标之间存在关系。矩阵。好主意! (p.s.我也尝试将指标和函数返回中的值一起包括在内,但它确实很混乱,我宁愿用一种奇特的数学方式来做。

3 个答案:

答案 0 :(得分: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

现在您可以将矩阵展平为1 by m*n,您想要的两个值为rowrow+col

答案 1 :(得分:0)

我建议使用meshgrid创建两个索引矩阵:

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

然后将lower triangular part的严格上限或linear index用于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));

现在ind1ind2包含V1中值的T的行和列索引。

我建议逐步执行这些代码行并检查中间变量以查看所有内容。

答案 2 :(得分:0)

在函数f(x,y)中使用矩阵中的元素(假设它被命名为A,并且具有m行和n列的维度)的顺序与您使用的顺序相同正在看向量(让我们假设m = 2,A(1,:)是矩阵A的第一行)

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

并将其所有组合(假设矩阵A中的条目都不相同)通过获取向量的最左边元素并将其与右边的所有元素进行比较(按从左到右的顺序)等等,直到你从向量w生成了大小为2的所有组合。 我将矩阵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)个条目都将向量w的第一个元素作为f(x,y)的第一个输入,而下一个(m * n - 2) )条目将向量w的第二个元素作为f(x,y)的第一个输入,依此类推。如果index等于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))