Построить матрицу из вектора, содержащего максимум каждой возможной пары - PullRequest
1 голос
/ 21 февраля 2012

Учитывая вектор размера n

A=[2 2 5 1] % n=4

Построить матрицу R размера nxn, в которой значение, соответствующее элементу (i, j), является максимальным между A (i) и A (j)

R = 
    2     2     5     2
    2     2     5     2
    5     5     5     5
    2     2     5     1 

Я делаю это с помощью цикла for. Есть ли более эффективный способ?

 R = zeros(size(a,2))
 for i=1:size(R,1)
    for j=1:size(R,2)
        R(i,j) = max(A(i),A(j));
    end
 end

Спасибо за вашу помощь:)

Ответы [ 4 ]

4 голосов
/ 21 февраля 2012

Это, по крайней мере, более матлабый способ:

B=ones(size(A))'*A
R=max(B,B')

Я бы ожидал, что это намного быстрее.

3 голосов
/ 21 февраля 2012

Ну, если честно, истинный путь MATLAB - это не то, что предложил Йохан. Это даже не самый быстрый способ. В три раза быстрее использовать bsxfun, по-настоящему MATLAB.

>> A= rand(1,1000);

>> tic,B=ones(size(A))'*A;R=max(B,B');toc
Elapsed time is 0.027081 seconds.

>> tic,R = bsxfun(@max,A',A);toc
Elapsed time is 0.006306 seconds.
1 голос
/ 21 февраля 2012

Это расширенный комментарий, а не ответ ... Я потерял связь с моими серверами разработки, поэтому счел целесообразным потратить некоторое время.Я определил файл сценария, содержащий код:

A=1:1500; % bigger vector for stable timing
tStart = tic;
R = zeros(size(A,2));
 for i=1:size(R,1)
    for j=1:size(R,2)
        R(i,j) = max(A(i),A(j));
    end
end
tElapsed = toc(tStart)

другой сценарий, содержащий:

A=1:1500;
tStart = tic;
B=ones(size(A))'*A;
R=max(B,B');
tElapsed = toc(tStart)

и третий, содержащий:

A=1:1500;
tStart = tic;
r=size(A,2);
R=ones(r);
for i=1:r
   for j=(i+1):r
       R(i,j)=max(A(i),A(j));
       R(j,i)=R(i,j);
   end
R(i,i)=A(i);
end
tElapsed = toc(tStart)

, и запускал их каждые 5раз.Среднее время ожидания составило: 1.7674 с, 0.0520 с, 0.0645 с, поэтому ответ @Johan Lundberg берет лавры за (временную) эффективность.

Ради полноты я рассчитал @woodchips ответ;истекшее среднее время составило 0,0206 с.@ Джохан страдает от позора, когда лавры вырывают из его лба.

0 голосов
/ 21 февраля 2012
  1. Ваша матрица всегда симметрична, так как max {A (i), A (j)} = max {A (j), A (i)}.Таким образом, вы можете уменьшить количество проверок вдвое.
  2. Ваша диагональ всегда ваш входной вектор.diag (R) = A

Поэтому я предлагаю вам проверить только один раз:

r=size(A,2)
R=ones(r)
for i=1:r
   for j=(i+1):r
       R(i,j)=max(A(i),A(j))
       R(j,i)=R(i,j)
   end
R(i,i)=A(i)
end

(сохраните ваш размер (A, 2), так как он не изменится после ввода ив противном случае matlab будет вычислять его каждый раз!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...