在空间矩阵乘法后找到索引位置。 bsxfun已实施

时间:2014-06-17 06:23:54

标签: matlab matrix-multiplication bsxfun

我需要帮助在复杂的矩阵乘法后找到矩阵和两个向量的一些索引位置,请耐心看看我先得到的东西,我的问题最后会出现。

我有两个矩阵L1L2

L1 = firstMatrix;
L2 = secondMatrix;

我需要计算来自L1的每个值与L2的所有值的差异(逐列),再次以列方式形式,这样做如下:< / p>

第一步

lib1 = bsxfun(@minus, L1(:,1)',L2(:,1));
lib1=lib1(:);
lib2 = bsxfun(@minus, L1(:,2)',L2(:,2));
lib2=lib2(:);
lib3 = bsxfun(@minus, L1(:,3)',L2(:,3));
lib3=lib3(:);

最后我有了我的新矩阵LBR

LBR = [lib1 lib2 lib3];

现在,我在一个具有相同步长的封闭域上有两个向量alphabeta -given,在这种情况下它们是相同的 - 。

alpha = 0:0.1:2;
beta = 0:0.1:2;

我现在需要计算张量积,我可以用两种方式来计算:

第二步

第一种方式

alphat1 = kron(alpha,lib1);
alphat2 = kron(alpha,lib2);
alphat3 = kron(alpha,lib3);
T1 = [alphat1 alphat2 alphat3];
betat1 = kron(beta,lib1);
betat2 = kron(beta,lib2);
betat3 = kron(beta,lib3);
T2 = [betat1 betat2 betat3];

或者,第二种方式,这是来自matlab的bsxfun

val = bsxfun(@times,LBR,permute(alpha,[3 1 2]));
T = reshape(permute(val,[1 3 2]),size(val,1)*size(val,3),[]);

val2 = bsxfun(@times,LBR,permute(beta,[3 1 2]));
T2 = reshape(permute(val2,[1 3 2]),size(val2,1)*size(val2,3),[]);

我的问题:

我需要通过以下方式找到min-distance,首先,我当然有三个常量:

gama1 = value1;
gama2 = value2;
gama3 = value3;

min-distance的计算方法如下:

第三步

[d,p] = min(((T(:,1)-T2(:,1))-gama1).^2 + ((T(:,2)-T2(:,2))-gama2).^2 +
((T(:,3)-T2(:,3))-gama3).^2);
d = sqrt(d);

我非常需要满足此L1问题的L2alphabetamin-distance的索引位置。

我尝试了以下内容:

第四步

[minindex_alongL2, minindex_alongL1, minindex_alongalpha, minindex_alongbeta] = 
ind2sub([size(L2,1) size(L1,1) numel(alpha) numel(beta)],p);

但它不起作用。我非常感谢你能给我的所有帮助!

提前致谢。

1 个答案:

答案 0 :(得分:1)

alphabeta分别获得TT2。然后,您在TT2之间执行逐列减法,而不是T中每列{(1}}}对T2中相同列号的所有元素的减法。如果您想执行后者,您很可能需要从头开始更改代码并删除连接并扩展到多维数组。

继续使用代码中的内容,您最多可以获得alpha-beta联合alpha索引,而不是beta[minindex_alongL2, minindex_alongL1, minindex_alongalphabeta] = ind2sub([size(L2,1) size(L1,1) numel(alpha)],p) 的单独索引。

因此,您可以使用 -

L1

编辑1:假设您输入的值为L2value1value2value3alpha和行向量betalib1 = bsxfun(@minus, L1(:,1)',L2(:,1)); %%//' lib2 = bsxfun(@minus, L1(:,2)',L2(:,2)); %%//' lib3 = bsxfun(@minus, L1(:,3)',L2(:,3)); %%//' t1 = cat(3,lib1,lib2,lib3); t2 = permute(alpha,[4 3 1 2]); T = bsxfun(@times,t1,t2); t22 = permute(beta,[4 3 1 2]); T2 = bsxfun(@times,t1,t22); gama1 = value1; gama2 = value2; gama3 = value3; mat1 = bsxfun(@minus,T,permute(T2,[1 2 3 5 4])); mat2 = bsxfun(@minus,mat1,permute([gama1;gama2;gama3],[3 2 1])); mat2 = squeeze(sum(mat2,3)); [d,p] = min(mat2(:)); d = sqrt(d); [minindex_alongL2, minindex_alongL1, minindex_alongalpha, minindex_alongbeta] = ind2sub([size(L2,1) size(L1,1) numel(alpha) numel(beta)],p) ,看看此代码是否适合您 -

{{1}}