我有两个大小分别为4700x1和100x1的大矩阵。我想实现以下逻辑,但我不确定什么是实现它的最佳方式。我想用一个简单的例子来解释这一点。
假设我有两个大小分别为9x1和3x1的矩阵。
A= 10
20
30
50
40
60
45
30
15和
B=28
22
26我想把B的每一行和A.There的矩阵A中的9行和B中的3行进行比较。当我们考虑矩阵B的第一行时,我们只需要考虑矩阵A的前3行(第1行、第2行和第3行),并从矩阵中取最低值。然后,当我们想要考虑矩阵B的第二行时,我们将选择接下来的3行(第4行、第5行和第6行),当我们考虑矩阵B的最后一行时,我们将考虑最后3行(第7行、第8行和第9行),并从它们中获取最低的值。我们需要放一个叫做"K“的变量。当K=1时,当我们对B的每一行进行比较时,我们必须取一个最低值,类似地,当K=2时,我们将从B行取2个最低值,以此类推。
该怎么做呢?任何建议都会很有帮助。非常感谢。
你们中的一些人似乎无法理解我的确切意思。让我用另一个例子来解释(因为A和B是很小的矩阵)。我正在研究一种名为“手指打印”的技术来估计设备在室内环境中的位置。在上述查询中,A是由参考点的接收信号强度( RSSI )值组成的矩阵,B是由测试点的RSSI值组成的矩阵。让我们从一开始就考虑另一个例子。假设有3个接入点,我有一个47x3大小的矩阵(假设有47个参考点),
A= [10,20,30;50,40,60;45,30,15;....;9,16,19] 请注意A是47x3矩阵。此矩阵表示相对于其访问点的RSSI值。让我们检查第一行--第一行,这是我们的第一个点和相对于接入点-1的RSSI值为10,而相对于接入点-2的RSSI值为20,相对于接入点-3,RSSI值为30,因此on.This矩阵表示参考点的位置和相对于所有3个访问点的RSSI值。
现在假设我们有另一个大小为10x3的矩阵,它由RSSI及其有关测试点的位置信息组成,
B=[12,15,18;25,32,38;....;7,18,22]现在我必须用整个矩阵计算测试点每一行之间的欧氏距离,例如:sqrt(10-12)^2+(20-15)^2+(30-18)^2,然后sqrt(50-12)^2+(40-15)^2+(60-18)^2)。。(9-12)^2+(16-15)^2+(19-18)^2)
现在我们必须考虑矩阵A中所有元素的第二行B,
(10-25)^2+(20-32)^2+(30-38)^2,然后是sqrt(50-25)^2+(40-32)^2+(60-38)^2)。。(9-25)^2+(16-32)^2+(19-38)^2)
诸若此类。
现在,我们将有一个大小为470X1的新矩阵(因为我们正在考虑一次使用所有参考点的一个测试点。在这个例子中,我们将有47个值。因此,对于10个测试点,我们将有470个值,现在如果我们将它们排列在一列中,那么我们将有一个470 X1矩阵)。
我已经做了到目前为止,我需要在下面这部分工作,现在我们必须找出哪一个是最低的欧几里得差值对每个测试点。例如,我们只从我们的第一个测试点得到了矩阵470X1的前47个值(位置1到47)。因此,在这种情况下,我们只需要考虑前47个值,并从它们和它的位置得到最低值。然后,对于下一组47个值(位置是相同的,因为我们总共只有47个位置,这是我们在考虑第二个测试点时得到的另一个集合)。也就是说,从48到94,我们必须找出另一个最低值及其位置。(请注意,只有47个参照点,因此470X1矩阵的第48值再次位于位置1,第49位在位置2,等等)。
在这种情况下,我们必须使用一个变量"K“,它将显示我们必须从470X1矩阵和10个测试点取多少个最低值。如果是K=1,那么我们必须为470X1矩阵中的每一组47个值取一个最低值。(例如,对于测试点-1,我们有一个最低值来自前47个值,然后对于测试点-2,我们有另一个最低值来自下一组47个值等等)。因此,对于10个测试点,我们总共将有10个最低值(我们还需要知道它们在哪里)。
类似地,对于K=2,我们将选择2个最低值,最后我们将有20个最低值,依此类推。
如果我们选择"K“超过1,那么我们必须取平均值,然后再得到10个值。
(这就是我想知道的。我不知道该怎么做)。
然后,通过取每个测试点的位置与该点的最低欧几里德距离值之间的差值来估计误差。
希望现在一切都清楚了。
发布于 2015-05-03 01:44:11
检查下面的代码。如果A中有相似的值,你可能会想到你的策略是什么。
clear all;
A = [10 20 30 50 40 60 45 30 15];
B = [28 22 26];
k = 1;
for ai = 1:numel(B):numel(A)
A2 = sort(A(ai:ai+numel(B)-1));
for ki = 1:k
minA = A2(ki);
locMinA = find(A(ai:ai+numel(B)-1) == minA);
fprintf('ai = %d\tki = %d\tmin = %d\tlocation = %d\n', ai, ki, minA, locMinA);
end
end当k=1时输出:
ai = 1 ki = 1 min = 10 location = 1
ai = 4 ki = 1 min = 40 location = 2
ai = 7 ki = 1 min = 15 location = 3当k=2时输出:
ai = 1 ki = 1 min = 10 location = 1
ai = 1 ki = 2 min = 20 location = 2
ai = 4 ki = 1 min = 40 location = 2
ai = 4 ki = 2 min = 50 location = 1
ai = 7 ki = 1 min = 15 location = 3
ai = 7 ki = 2 min = 30 location = 2发布于 2015-05-03 02:53:05
下面是一种矢量化方法:
[val loc]=sort(reshape(A,length(B),length(A)/length(B),1))
getk = @(x,y)(x(1:y,:)(:));
k=2; % Example value of k
getk(val,k) % Minimum values vector
getk(loc,k) % Minimum location vector在你的例子中,我假设3是两个向量的长度之比。我还假设B值不用于最小值的计算。
https://stackoverflow.com/questions/30008313
复制相似问题