Create a vector of vector exponents

Hi,
Assume I have a vector v and a square matrix A
v = [1, 2, 3, 4, 5];
A = randn(5);
I want to create a matrix
m = [v*A; v*A^2; v*A^3; ..; v*A^n]
Where n is a user input and ^ results in the matrix product operator (not dot product .^)
I can do that easily with a loop. Is there a quicker way of doing this without using a loop?

 採用された回答

Matt J
Matt J 2019 年 5 月 17 日
編集済み: Matt J 2019 年 5 月 17 日

0 投票

No, a for-loop is fastest, but you want to implement it the right way, with a recursive update,
m=repmat(v*A,n,1); %pre-allocate
for i=2:n
m(i,:) = m(i-1,:)*A;
end
That way, the process takes only n matrix multiplications.

その他の回答 (1 件)

Adam Danz
Adam Danz 2019 年 5 月 17 日
編集済み: Adam Danz 2019 年 5 月 20 日

0 投票

No loop method:
m = cell2mat(arrayfun(@(x)v*A.^x,1:n,'UniformOutput',false)')
Test result with loop version
mm = zeros(6,5);
for i = 1:n
mm(i,:) = v*A.^i;
end
isequal(m,mm) % = 1, same result
Which is faster?
To test speed, I ran 100,000 iterations of the one-liner and the same number of iterations of the for-loop (just the loop, the pre-allocation was done before the timer started). The variable n=20. The median speed of the for-loop was 2.7 times faster than the arrayfun() method (p<0.001 wilcox signed rank test). The for-loop is the clear winner for speed.

2 件のコメント

Rik
Rik 2019 年 5 月 17 日
Given that A is a square matrix, Jean Dupin might actually mean ^ instead of .^ as the operation to be applied to A.
Adam Danz
Adam Danz 2019 年 5 月 17 日
That's a good point Rik. Jean Dupin, be sure to apply the correct operation.

サインインしてコメントする。

カテゴリ

ヘルプ センター および File ExchangeCreating and Concatenating Matrices についてさらに検索

質問済み:

2019 年 5 月 17 日

編集済み:

2019 年 5 月 20 日

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by