Степени матрицы

У меня есть квадратная матрица A (nxn). Я хотел бы создать ряд k степеней этой матрицы в многомерную матрицу nxnxk (не по элементам, а фактические степени матрицы), т.е. получить [A^0 A^1 A^2..A^k]. Это своего рода разнообразный вандермонд для матричного корпуса.

Я могу сделать это с помощью циклов, но это раздражает и медленно. Я пытался использовать bsxfun, но мне не повезло, так как я, вероятно, что-то здесь упускаю.

Вот простой цикл, который я сделал:

for j=1:1:100 
    final(:,:,j)=A^(j-1); 
end

person imtl    schedule 13.09.2015    source источник


Ответы (1)


Вы пытаетесь выполнить кумулятивную версию mpower с вектором из k значений.

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

Ваш исходный код цикла выглядел примерно так:

final = zeros([size(A),100]);
for j=1:1:100 
    final(:,:,j)=A^(j-1); 
end

Таким образом, с предложением модифицированный зацикленный код будет -

final = zeros([size(A),100]);
matprod = A^0;
final(:,:,1) = matprod;
for j=2:1:100 
    matprod = A*matprod;
    final(:,:,j)= matprod;
end

Бенчмаркинг -

%// Input
A = randi(9,200,200);

disp('---------- Original loop code -----------------')
tic
final = zeros([size(A),100]);
for j=1:1:100 
    final(:,:,j)=A^(j-1); 
end
toc

disp('---------- Modified loop code -----------------')
tic
final2 = zeros([size(A),100]);
matprod = A^0;
final2(:,:,1) = matprod;
for j=2:1:100 
    matprod = A*matprod;
    final2(:,:,j)= matprod;
end
toc

Время выполнения -

---------- Original loop code -----------------
Elapsed time is 1.255266 seconds.
---------- Modified loop code -----------------
Elapsed time is 0.205227 seconds.
person Divakar    schedule 13.09.2015
comment
Большое спасибо за быстрый ответ. Это дает поэлементную мощность матрицы. Я ищу mpower матрицы. это A^k, а не A.^k. Я надеюсь, что я ясно с моим вопросом. Спасибо еще раз! - person imtl; 13.09.2015
comment
В порядке. Попробую еще раз объяснить получше. k является вектором 0:1:m (например, m=100). Я хотел бы получить m степеней матрицы A (nxn). Это мультимассив [A^0 A^1 A^2....A^m]. Всего m матриц. Или массив nxnxm. Надеюсь, теперь я более понятен. Извините за путаницу. - person imtl; 13.09.2015
comment
@imtl Да, думаю, теперь понятно, спасибо. Кроме того, не могли бы вы добавить какой-либо код цикла for, который вы, возможно, пытались ответить на вопрос? - person Divakar; 13.09.2015
comment
Я добавил цикл к опубликованному вопросу. Извините, я новичок на этом сайте и еще не знаком с форматом - person imtl; 13.09.2015
comment
Спасибо за вашу помощь. Я ценю его. - person imtl; 13.09.2015
comment
@StewieGriffin Ну, мы говорим о перемножении матриц, что не так просто сделать. Если bsxfun должен иметь векторизованный @mpower, я думаю, потребуется больше, чем просто использование BLAS. Для начала, ребята из mathworks могут сделать это в зацикленном коде уровня C, чтобы получить наилучшую возможную реализацию. - person Divakar; 13.09.2015
comment
О боже, вы использовали j в качестве переменной... Нужно ли мне ссылаться на блестящий пост Шаи об этом? ;) - person Adriaan; 23.09.2015
comment
@Adriaan Скажи им, что я невосприимчив к мнимым числам и сопряженным транспонированиям;) - person Divakar; 23.09.2015