Matlab 有没有办法在matrix repmat阵列上执行mpower?

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作为数组的能力

假设我们有这个矩阵

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/倍频程用户通常想到的方面存在“普通”矢量化的可能性。尽管如此,你是对的。你应该在另一个答案中加入这一点。