我的任务是找到矩阵中元素的最大乘积。输入参数是矩阵和标量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)。
任何帮助将不胜感激。
答案 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矩阵的一侧增加额外的输出