Matlab 有没有办法在matrix repmat阵列上执行mpower?
我想知道是否有一种方法可以提高矩阵a作为数组的能力 假设我们有这个矩阵Matlab 有没有办法在matrix repmat阵列上执行mpower?,matlab,vectorization,Matlab,Vectorization,我想知道是否有一种方法可以提高矩阵a作为数组的能力 假设我们有这个矩阵 A = 5 4 3 6 然后我们重复它的形状 >> repmat(A, 5, 1) ans = 5 4 3 6 5 4 3 6 5 4 3 6 5 4 3 6 5 4 3 6 现在我想提高功率,使长时间重复的矩阵如下所示: >> [A^1; A^2; A^3; A^4; A^
A =
5 4
3 6
然后我们重复它的形状
>> repmat(A, 5, 1)
ans =
5 4
3 6
5 4
3 6
5 4
3 6
5 4
3 6
5 4
3 6
现在我想提高功率,使长时间重复的矩阵如下所示:
>> [A^1; A^2; A^3; A^4; A^5]
ans =
5 4
3 6
37 44
33 48
317 412
309 420
2821 3740
2805 3756
25325 33724
25293 33756
SP = sparse(kron(eye(n,n),P))*sparse(MD)*sparse(kron(eye(n,n),P^-1));
在MATLAB/Octave中不使用for循环是否可以做到这一点?EDIT
在我的回答中还要提到这一点:递归并不像Matlab/倍频程用户通常想到的那样是矢量化。我只是想到了一个递归的、匿名的函数,并且发现给定的任务是一个很好的小例子,可以在上面测试引用的解决方案
我在寻找递归的匿名函数,并找到了。我结合了那里的想法,以满足问题中所述的期望,并编写了这段简短的代码片段
%输入。
A=[54;36]
%设置递归匿名函数。
iif=@(varargin)varargin{2*find([varargin{1:2:end}],1,'first')}();
recPower=@(A,B,n,f)iif(n>1,@()[B;f(A,A*B,n-1,f)],true,@()B);
nPower=@(A,n)recPower(A,A,n,recPower);
%计算任意n。
nPower(A,5)
有关解释,请看链接的答案
输出:
A=
5 4
3 6
ans=
5 4
3 6
37 44
33 48
317 412
309 420
2821 3740
2805 3756
25325 33724
25293 33756
另一个使用arrayfun的选项
B = cell2mat(arrayfun(@(x)A^x,1:5,'UniformOutput',0).')
结果:
B =
5 4
3 6
37 44
33 48
317 412
309 420
2821 3740
2805 3756
25325 33724
25293 33756
但在这种情况下,基本for循环可能是最快的选择
倍频程基准测试:
tic
iif = @(varargin) varargin{2*find([varargin{1:2:end}], 1, 'first')}();
recPower = @(A, B, n, f) iif(n > 1, @() [B; f(A, A * B, n - 1, f)], true, @() B);
nPower = @(A, n) recPower(A, A, n, recPower);
for ii = 1:1000
% Calculate for arbitrary n.
nPower(A, 5);
end
toc
运行时间为1.023秒
tic
for ii = 1:1000
B = cell2mat(arrayfun(@(x)A^x,1:5,'UniformOutput',0).');
end
toc
运行时间为4.8684秒
tic
for ii = 1:1000
B=[];
for jj = 1:5
B = [B;A^jj];
end
end
toc
已用时间为0.039371秒如果您真的想使用矢量化(在本例中这是一种过分的方法),还可以使用以下属性:
A^n = P*D^n*P^-1 %A SHOULD BE a diagonalizable matrix
在哪里
[P,D] = eig(A) %the eigenvectors and eigenvalue
所以
与:
您仍然需要提取这些值。在这种情况下,使用稀疏矩阵来减少内存使用可能会很有趣
大概是这样的:
>> [A^1; A^2; A^3; A^4; A^5]
ans =
5 4
3 6
37 44
33 48
317 412
309 420
2821 3740
2805 3756
25325 33724
25293 33756
SP = sparse(kron(eye(n,n),P))*sparse(MD)*sparse(kron(eye(n,n),P^-1));
MATLAB还是倍频程?请挑一个。答案可能不一样。请注意标记使用指南:“不要同时使用[matlab]和[octave]标记,除非问题是关于两者之间的相似性或差异。”此外,为什么要避免循环?这部分代码是不是一个瓶颈?@CrisLuengo这没关系。Matlab和Octave具有相同的语法,Octave可以编写Matlab代码。因为循环在Matlab中不再慢,许多矢量化工作实际上会减慢执行速度。在对简单解决方案进行编程并发现它对应用程序来说太慢之前,不要进行矢量化。否则你就是在浪费时间。您需要能够比较矢量化代码的计时,以确保您实际上选择了最快的代码。Octave还缺少很多在MATLAB中可用的函数,并且它有一些在MATLAB中不存在的函数。Octave不能完成我写的很多MATLAB代码,MATLAB也不能完成人们在这里的问题中发布的很多Octave代码。arrayfun
是一个循环。标签表明需要矢量化使用arrayfun
也是我的第一个想法。原则上,我同意在该任务中使用循环,正如Cris Luengo在上述评论中最初所述。请注意,递归不是矢量化。@SardarUsama我知道,实际上我想在回答中提到它。一般来说,我不认为在Matlab/倍频程用户通常想到的方面存在“普通”矢量化的可能性。尽管如此,你是对的。你应该在另一个答案中加入这一点。