如何矢量化matlab的以下模块

如何矢量化matlab的以下模块,matlab,vectorization,Matlab,Vectorization,假设A有边界(1:2,1:2,1:numfoo),如何对以下行进行矢量化: W = zeros( 2, 2, numfoo ); for i = 1:numfoo temp(1:2,1:2) = inv( A(1:2,1:2,i) ); W(1:2,1:2,i) = ( temp * (temp') ); end 蒂娅 首先,此代码可以大大简化: W = zeros( 2, 2, numfoo ); for i = 1:numfoo temp = inv( A(:,:

假设A有边界(1:2,1:2,1:numfoo),如何对以下行进行矢量化:

W = zeros( 2, 2, numfoo );
for i = 1:numfoo
    temp(1:2,1:2) = inv( A(1:2,1:2,i) );
    W(1:2,1:2,i) = ( temp *  (temp') );
end

蒂娅

首先,此代码可以大大简化:

W = zeros( 2, 2, numfoo );
for i = 1:numfoo
    temp = inv( A(:,:,i) );
    W(:,:,i) = temp *  temp';
end

第二,你说的“矢量化以下行”是什么意思?你的目标是什么?你想摆脱FOR循环吗?你认为这段代码如果被“矢量化”会运行得更快吗?您要找的是什么?

我发现许多示例表明矢量化代码并不总是更快或更清晰

若你们想要矢量化的代码,这里是一个使用单元格数组,并没有for循环的代码,但它速度较慢,不像你们的代码那个样清晰

Acell = mat2cell(A,2,2,ones(1,1,numfoo));
temp = cellfun(@inv,Acell,'UniformOutput',0);
W = cellfun(@(x,y)x*x', temp,'UniformOutput',0);
W = cell2mat(W);

结果与您的代码相同。

使用mldivide而不是inv可以获得一点速度增益

clear
clc
tic
numfoo=10000;
W = zeros( 2, 2, numfoo );
A=rand(2,2,numfoo);
for i = 1:numfoo
    temp(1:2,1:2) = inv( A(:,:,i) );
    W(1:2,1:2,i) = temp *temp';
end
toc

tic
for i = 1:numfoo
    temp(1:2,1:2) = A(:,:,i)\[1 0;0 1];
    W(1:2,1:2,i) = temp * temp' ;
end
toc
在我的机器上, 运行时间为0.182324秒。
所用时间为0.162933秒。

由于矩阵大小仅为
2
,因此可以使用显式表达式对代码进行矢量化。

我测试了它,它给出了相同的结果,并且加速了x100

Elapsed time is 1.070547 seconds.
Elapsed time is 0.012767 seconds.

考虑把这个贴在Matlab答案上:对不起,是什么?我问了你很多问题,你对什么说是?请讲清楚。是的,我不想摆脱for循环。因为这是我的文件中唯一一行包含显式for-loop。但是我可以问一下为什么要去掉for-loop吗?正如@yuk所提到的,它可能会降低代码的清晰度,甚至降低性能。因为我想这样做,但我自己不知道如何做到这一点。这不足以让我们看一看吗???有时矢量化的代码实际上并不比循环快,因为经常会涉及到一些命令,它们需要以某种方式复制、重塑或修改矩阵,以便能够通过使用简单的数学运算等来解决任务。。。因此,如果您对速度或诸如此类的问题没有任何考虑,那么它可能不值得:)除此之外,它在数值上是稳定的-与invI Agree不同,这是最快的实现
Elapsed time is 1.070547 seconds.
Elapsed time is 0.012767 seconds.