2016-09-15 6 views
1

У меня есть задача найти максимальный продукт элементов в матрице. Входными аргументами являются матрица и скаляр n, которые сообщают мне, сколько элементов нужно умножить. Если n = 2, то я должен умножить два на два. Максимальный продукт может лежать либо в строках, либо в столбцах по диагонали. Например, в этом случае элементы A были умножены на 2 по 2 вдоль строк (B) и столбцов (C).Найти индексы элементов матрицы, которые образуют максимальный продукт

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) Я не могу найти индексы исходных элементов матрицы, которые сформировали этот продукт, т. е. (2,2) и (3,2) ,

Любая помощь будет оценена по достоинству.

+0

Как это работает для N = 3? Возьмите B, а затем умножьте строки и столбцы на BB = [48 525 648] и BC = [120 210; 540 630]? Или вы вернетесь к исходной матрице? –

+0

Нет, мы начинаем всегда с оригинальной матрицы. «N» - входной аргумент, и он показывает количество элементов, которые я должен использовать для умножения. В случае 'n = 3' мы получаем' B = 48,0000 105,0000 72,0000' и ​​'C = 96,0000 45,0000 84,0000'. В этом случае max составляет 105, что является произведением' A (3,1) * A (3,2) * A (3,3) ' – esem

+0

Последние бит разъяснений; скажем, ваш вход - это вектор строки [2 2 1 2]. Правильный ответ для n = 3 4, или это 8? [Нужны ли номера в строке?]. Если входной сигнал [1 0; 0 1] является ответом на n = 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 

I «не совсем уверен, является ли п это расстояние, в этом случае:

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

или означают ли вы взять произведение всех слагаемых в п от начальной точки. В любом случае максимум можно найти, используя приведенный выше код.

+0

Ответ хороший, но только адаптирован к 'n = 2'.N - входной аргумент, и он показывает количество элементов, которые я должен использовать для умножения. В случае 'A = [8 1 6; 3 5 7; 4 9 2]' и 'n = 3' Я получаю' B = 48.0000 105.0000 72.0000' и ​​'C = 96.0000 45.0000 84.0000' В этом случае максимум равен 105 который является произведением 'A (3,1) * A (3,2) * A (3,3)' – esem

+0

Это справедливая точка! Чтобы иметь дело с n> 2, измените две команды в инструкции if на 'c2 = c1 + n-1' в первом условии и' r2 = r1 + n-1' в предложении else. – Dave

1

Учитывая входы А и п, и если вы не заботитесь, какой выход вы даете в случае ничьей,

%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