Эффективный метод для произведения субвекторов матрицы - PullRequest
0 голосов
/ 28 мая 2018

Предположим, что у нас есть матрица

A = [1 2 ; 3 4 ; 5 6];

и логическая матрица

B = [false true ; true true ; true false ];

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

C = [2 ; 3*4, 5] = [2 ; 12 ; 5];

. Один из методов заключается в следующем: 1) взять степень A относительно B;2) Возьмем произведение строки матрицы мощности:

C = prod(A.^B,2);

Кажется, что приведенная выше команда выполняет ненужные вычисления.Есть ли более быстрый способ вычисления C выше?

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

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

C = prod(A.*B + ~B, 2);

Я тестировал его только с octave, но это примерно вдвое быстрее.

Еще один менее компактный способ, также быстрый в octave:

C=A; C(~B)=1; C=prod(C,2);
0 голосов
/ 28 мая 2018

Вот еще один способ, используя accumarray.Я сомневаюсь, что это быстрее:

[ii, ~] = find(B); % create grouping variable
C = accumarray(ii, A(B), [], @prod); % compute product of each group
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...