Matlab 如何使用生成矩阵的3个循环对代码进行矢量化

Matlab 如何使用生成矩阵的3个循环对代码进行矢量化,matlab,performance,for-loop,multidimensional-array,vectorization,Matlab,Performance,For Loop,Multidimensional Array,Vectorization,你能帮我把这个Matlav代码矢量化,构造一个维度为MNx(2+N-1)xR的矩阵a,以加快速度吗?目前大约需要8秒 初始化 R=200; M=400; N=20; B=[kron((1:1:M)', ones(N,1)) repmat((1:1:N)', M,1)]; %(MN)x(2) B看起来像 B=[1 1; 1 2; ...; 1 20; 2 1; 2 2; ... 2 20; ... 400 20] 代码 一些解释 对于r=1

你能帮我把这个Matlav代码矢量化,构造一个维度为MNx(2+N-1)xR的矩阵
a
,以加快速度吗?目前大约需要8秒

初始化

R=200;
M=400;
N=20;
B=[kron((1:1:M)', ones(N,1)) repmat((1:1:N)', M,1)]; %(MN)x(2)
B
看起来像

B=[1 1;
   1 2;
   ...;
   1 20;
   2 1;
   2 2;
   ...
   2 20;
   ...
   400 20]
代码

一些解释

对于
r=1,…,r

A
是这样的

对于
m=1,…,m
j=1,…,N


前两列中以
[m j]
开头的
A(:,:,r)
行填充剩余的
(N-1)
列,每个
h~=j
,其中
uj,uh,ujh
是i.i.d标准高斯数,可在
utemp1
utemp2
中找到。您可以预先计算索引并在500次迭代中使用它们:

idx = repmat(reshape(1:M*N,M,N).',1,N);
idx = reshape(idx(logical(kron(~eye(N),ones(1,M)))),N-1,[]).';
for k=1:500
    for r=1:R
        utemp2=randn(M*N,1);
        A(:,3:end,r)=randn(M*N, N-1)+bsxfun(@plus,utemp2,utemp2(idx) );
    end
end

然而,分配大型矩阵,特别是重复元素的矩阵,并对其进行矢量化操作并不总是最有效的方法。内置函数可直接在原始数组上操作,避免重复数组元素。

请描述您试图解决的问题,而不仅仅是转储代码并要求我们将其矢量化。。。如果我们知道您想做什么,也许我们可以建议您使用内置或FEX功能。。。。。。然后你想用A做什么?它是很长代码(模拟力矩估计方法)的一部分。简言之,我使用它来使用一些数据估计模型的参数。我想获得一些效率,因为我需要重复这个步骤500次。如果你想对每行的元素求和,我认为有一些快速的内置程序可用
idx = repmat(reshape(1:M*N,M,N).',1,N);
idx = reshape(idx(logical(kron(~eye(N),ones(1,M)))),N-1,[]).';
for k=1:500
    for r=1:R
        utemp2=randn(M*N,1);
        A(:,3:end,r)=randn(M*N, N-1)+bsxfun(@plus,utemp2,utemp2(idx) );
    end
end