查找构成最大乘积

时间:2016-09-15 11:23:07

标签: matlab matrix matrix-multiplication

我的任务是找到矩阵中元素的最大乘积。输入参数是矩阵和标量n,它告诉我要乘法的元素数量。如果n = 2,那么我应该将两乘二。最大产品可以是行,也可以是对角线上的列。例如,在这种情况下,A&#39的元素沿着行(B)和列(C)乘以2乘以2。

A =
   8     1     6
   3     5     7
   4     9     2
B =
      8.0000    6.0000
     15.0000   35.0000
     36.0000   18.0000
C =
     24.0000    5.0000   42.0000
     12.0000   45.0000   14.0000

我使用循环

    c=[]
for ii = 1:(length(A)-n+1)
    p = prod(A(:,ii:ii+n-1));
    c=[c p];
end

for i=1:size(A,2)
      B(i,:)=real(exp(conv(log(A(i,:)),ones(1,n),'valid')));
      C(:,i)=real(exp(conv(log(A(:,i)),ones(1,n),'valid')));
end

在这两种情况下,我都收到了产品,但是在获得产品中的最大值时,(在我的情况下是 A(2,2)* A(3,2)= 45 <的产品/ strong>)我找不到形成该产品的原始矩阵元素的索引,即(2,2)和(3,2)。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

可以通过知道B或C中的最大值出现的位置来计算出信息。这是由max函数作为第二个参数返回的,尽管是索引形式。我已经尝试过你的代码来生成B和C,但它似乎并没有产生你所拥有的东西,但是,假设你有一些方法可以生成B和C,就像问题的第一部分一样,下面的代码将返回(r1,c1)和(r2,c2)对两个被乘数的引用(假设只有一个最大值 - 你真的需要检查这个):

[maxB,IB]=max(B(:));
[maxC,IC]=max(C(:));
if (maxB>maxC)
    [r1,c1]=ind2sub(size(B),IB);
    r2=r1; c2=c1+n-1;
else
    [r1,c1]=ind2sub(size(C),IC);
    r2=r1+n-1; c2=c1;
end

我不太确定n是否是距离,在这种情况下:

B=A(:,1:end-n+1).*A(:,n:end);
C=A(1:end-n+1,:).*A(n:end,:);

或者你的意思是在起点的n之内取得所有术语的乘积。无论哪种方式,都可以使用上面的代码找到最大值。

答案 1 :(得分:1)

考虑到输入A和n,并假设您不关心在出现平局时给出的输出,

%Setup
[r, c] = size(A)
if r <= n
    maxProd = prod(A(1:n,1),1);
elseif c <= n
    maxProd = prod(A(1,1:n),2);
else 
    return
end

indOut = zeros(n, 2);
dirOut = 0;

%Check verticals 
for ii = 1:(r-n+1)
    for jj = 1:c
         testProd = prod(A(ii:ii+n-1,jj),1);
         if testProd > maxProd
             maxProd = testProd;
             indOut(1,:) = [ii jj];
             dirOut = 1;
         end
    end
end

%Check horizontals
for ii = 1:r
    for jj = 1:(c-n+1)
         testProd = prod(A(ii,jj:jj+n-1),2);
         if testProd > maxProd
             maxProd = testProd;
             indOut(1,:) = [ii jj];
             dirOut = 2;
         end
    end
end

%Set output
for ii = 2:n
    if dirOut == 1;
        indOut(1,n) = indOut(1,n-1) + 1;
    else
        indOut(2,n) = indOut(2,n-1) + 1;
    end
end

如果你关心领带,你必须在indOut矩阵的一侧增加额外的输出