我有一个奇怪的问题,但是这里有。我有一个矩阵包含(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.我也尝试将指标和函数返回中的值一起包括在内,但它确实很混乱,我宁愿用一种奇特的数学方式来做。
答案 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
,您想要的两个值为row
和row+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));
现在ind1
和ind2
包含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))