【问题标题】:Iteration of matrix-vector multiplication which stores specific index-positions存储特定索引位置的矩阵向量乘法的迭代
【发布时间】:2014-08-13 08:28:43
【问题描述】:

我需要解决一个最小距离问题,看看一些正在尝试的工作看看:

链接:click here

我有四个元素两个列向量:昏暗的alpha (px1) 和昏暗的beta (qx1)。在这种情况下,p = q = 50 给出两个暗淡(50x1) 的列向量。它们的定义如下:

alpha = alpha = 0:0.05:2;
beta = beta = 0:0.05:2;

我有两个矩阵L1L2

L1 由三个维度为(kx1) 的列向量组成。

L2 由三个维度为(mx1) 的列向量组成。

在这种情况下,它们具有相同的大小,这意味着 k = m = 1000 分别给出:L1L2 和暗淡的 (1000x3)。这些矩阵的值是预定义的。

不过,它们具有以下结构:

L1(kx3) = [t1(kx1) t2(kx1) t3(kx1)];
L2(mx3) = [t1(mx1) t2(mx1) t3(mx1)];

最小。我需要解决的距离问题(数学上)如下:

 d = min( (x-(alpha_p*t1_k - beta_q*t1_m)).^2 + (y-(alpha_p*t2_k - beta_q*t2_m)).^2 +
 (z-(alpha_p*t3_k - beta_q*t3_m)).^2 )

x,y,z 的值是三个固定常数。

我的问题

我需要开发一个迭代,它可以从alpha, beta, L1L2组合 中返回索引位置,从而解决上面的最小距离问题。

我希望问题的表述清楚,我对索引符号非常小心。但如果还不是很清楚……步长为:

alpha 是 p = 1,...50

beta 是 q = 1,...50

L1; t1, t2, t3 是 k = 1,...,1000

L2; t1, t2, t3 是 m = 1,...,1000

我需要找到index of pindex of qindex of kindex of m,这给了我最小的。到x,y,z点的距离。

提前感谢您的帮助!

【问题讨论】:

  • 你知道在SO 之外是否有办法做到这一点? t1,t2,t3 是(1000x3),在这里发布太多了......或者它可能不会?
  • external to the OP 是什么意思?
  • 我的意思是 StackOverflow,我已经修复了我的最后一条评论 :)
  • codereview.stackexchange.com 可能是一个地方,但那里的流量并不多。
  • 我不明白的地方: 1.) 使用t1_kt1_m 是否正确?因为遵循您上面的定义,这些值将始终相同(t2_m and t3_m 相同)。我猜你的意思是有 2 个不同的数组,它们对应于相同类型的数据,但不是完全相同的数据。 2.) 您确定您想要以下索引:p,q,k,m?因此,您想比较50x50x1000x1000?至少在你的问题中听起来是这样的。

标签: matlab min matrix-multiplication


【解决方案1】:

我不知道你的价值观,所以我无法检查我的代码。我正在使用循环,因为它是最明显的解决方案。很确定来自bsxfun-brigarde ( ;-D ) 的人会找到更短/更有效的解决方案。

alpha = 0:0.05:2;
beta = 0:0.05:2;

L1(kx3) = [t1(kx1) t2(kx1) t3(kx1)];
L2(mx3) = [t1(mx1) t2(mx1) t3(mx1)];
idx_smallest_d =[1,1,1,1];
smallest_d = min((x-(alpha(1)*t1(1) - beta(1)*t1(1))).^2 + (y-(alpha(1)*t2(1) - beta(1)*t2(1))).^2+...
                    (z-(alpha(1)*t3(1) - beta(1)*t3(1))).^2);

%The min. distance problem I need to solve is given (mathematically) as follows:
for p=1:1:50
    for q=1:1:50
        for k=1:1:1000
            for m=1:1:1000
                d = min((x-(alpha(p)*t1(k) - beta(q)*t1(m))).^2 + (y-(alpha(p)*t2(k) - beta(q)*t2(m))).^2+...
                    (z-(alpha(p)*t3(k) - beta(q)*t3(m))).^2);
                if d < smallest_d
                    smallest_d=d;
                    idx_smallest_d= [p,q,k,m];
                end
            end
        end
    end
end

我正在做的是将最小距离预定义为第一个组合的距离,然后检查每个组合,而不是距离小于之前的最短距离。

【讨论】:

  • 谢谢!!! :D 我会尽快尝试你的代码。我实际上已经为这个问题实现了bsxfun 代码。 (Divakar)是值得为此获得荣誉的人。但问题是:在计算你提到的多重性(50x50x1000x1000) 时,bsxfun 内存不足。所以,让我们看看老式的 for-loop 是如何解决这个问题的:D。再次感谢!
  • 您好,再次感谢您的帮助,现在,很抱歉,有一个问题打扰您了。在您的代码中,当您预定义最小距离时。我试图只写一个数字(例如 100),但代码不起作用,为什么?我是否需要始终使用我正在使用的向量预定义这个小距离?其次,选择alpha(1) and beta(1) 会给我零,这是我向量的值,这是“安全的”吗?还是我应该选择其他值?我正在处理同样的问题,只是循环比这个复杂得多,但是......
  • 原理是一样的(!) :) PS:到目前为止还没有bsxfun 的实现。循环工作得很好,很艰难!
  • @SergioHaram 您应该明确地使用最小距离而不是固定值的计算,因为您根本不知道是否有小于(100 您的示例)的距离。通过使用第一个距离,您可以确保结果是正确的。我真的不知道alpha(1)beta(1) 但在我看来这应该是~=0,否则你总是在第1步找到最小的可能距离(0)并且代码是不必要的
  • 是的,我明白你所指出的关于 alpha 和 beta 是 '~=0' 的内容。感谢您的快速回答,我将使用计算。我的最后一个问题是:当我预定义最小距离时,我从alpha, beta 和其他向量L1, L2 中选择一些条目。现在我正在使用四个向量 L1, L2, L3, L4 单独,alpha beta 已经出局了。我也从这个新的 4 个向量中选择了一些条目,为了预定义最小距离,我的问题是:如何选择这个 optimal 条目?因为L1(1,1), L2(1,1), L3(1,1) and L4(1,1).....
猜你喜欢
  • 2020-03-16
  • 2018-12-07
  • 2020-10-29
  • 1970-01-01
  • 1970-01-01
  • 2018-01-03
  • 1970-01-01
  • 1970-01-01
  • 2016-02-22
相关资源
最近更新 更多