@the骑自行车
:这个问题是一个跟进的问题今天下午早期创建的问题。
应用向量化技术来加速性能的一个3 d矩阵除以一个二维矩阵
5视图(30天)
显示旧的评论
我正在删除一个for循环在我的Matlab代码来提高性能。我原来的代码有一个for循环(
从j = 1: Nx
)有害性能(在我生产代码,这for循环处理超过2000万次,如果我测试大型模拟)。我很好奇如果我可以删除这个for循环通过向量化,repmat,或类似的技术。我原来的Matlab实现如下所示。
clc;清晰的所有;
%测试数据
%我想删除j的for循环下面的代码
N = 10;
M = 10;
Nx = 32;%纽约= Nx =新西兰
新西兰= 32;
纽约= 32;
Fnmhat =兰德(Nx,新西兰+ 1);
Jnmhat =兰德(Nx, 1);
xi_n_m_hat =兰德(Nx、N + 1 M + 1);
Uhat = 0 (Nx,新西兰+ 1);
Uhat_2 = 0 (Nx,新西兰+ 1);
identy =眼睛(纽约纽约+ 1 + 1);
p =兰德(Nx, 1);
gammap =兰德(Nx, 1);
D =兰德(纽约Nx + 1 + 1);
D2 =兰德(纽约Nx + 1 + 1);
D_start = D (1);
D_end = D(最终:);
γ= 1.5;
α= 0;%这可能是零
ntests = 100;
%原始代码转换成矢量图(部分)
抽搐
为n = 0: n
为m = 0: m
b = Fnmhat。”;
alphaalpha = 1.0;
betabeta = 0.0;%这可能是零
gammagamma =γ*γ- p。^ 2 - 2 *α。* p;%的大小(Nx, 1)
d_min = 1.0;
n_min = 0.0;%这可能是零
r_min = xi_n_m_hat (:, n + 1, + 1);
d_max = 1我。* gammap;
n_max = 1.0;
r_max = Jnmhat;
一个= alphaalpha * D2 + betabeta * D +交换(gammagamma (3,2,1))。* identy;
(:,:)= repmat (n_min * D_end, [1, 1, Nx]);
b(结束:)= r_min;
(,,,)=(结束、结束:)+ d_min;
(1::)= repmat (n_max * D_start, [1, 1, Nx]);
一(1 1:)=(1 1:)+交换(d_max [2、3、1]);
:b (1) = r_max;
% Non-vectorized代码——这部分可以向量化?
为j = 1: Nx
utilde = linsolve ((:,:, j)、b (:, j));% \ b
Uhat (j) = utilde。';
结束
结束
结束
toc
这是我尝试vectorizing代码(j和删除for循环)。
%与原始代码相同的测试数据
%的新代码(完全矢量化但不正确的)
抽搐
为n = 0: n
为m = 0: m
b = Fnmhat。”;
alphaalpha = 1.0;
betabeta = 0.0;%这可能是零
gammagamma =γ*γ- p。^ 2 - 2 *α。* p;%的大小(Nx, 1)
d_min = 1.0;
n_min = 0.0;%这可能是零
r_min = xi_n_m_hat (:, n + 1, + 1);
d_max = 1我。* gammap;
n_max = 1.0;
r_max = Jnmhat;
A2 = alphaalpha * D2 + betabeta * D +交换(gammagamma (3,2,1))。* identy;
A2 (:,:) = repmat (n_min * D_end, [1, 1, Nx]);
b(结束:)= r_min;
A2(结束、结束:)= A2(结束、结束:)+ d_min;
A2 (1::) = repmat (n_max * D_start, [1, 1, Nx]);
A2 (1 1:) = A2(1 1:) +交换(d_max [2、3、1]);
:b (1) = r_max;
% Non-vectorized代码——这部分可以向量化?
% j = 1: Nx
% utilde_2 = linsolve (A2 (:,:, j)、b (:, j));% A2 \ b
% Uhat_2 (j) = utilde_2。';
%结束
%我的尝试——这是行不通的,因为我不循环指数j
%在repmat
utilde_2 =挤压(repmat (linsolve (A2 (:,:, Nx)、b (:, Nx)), (1, 1, Nx)));
utilde_2 = utilde_2 (: 1);
Uhat_2 =挤压(repmat (utilde_2”, [1, 1, Nx]));
Uhat_2 = Uhat_2 ';
结束
结束
toc
diff =规范(Uhat——Uhat_2 inf);如果正确% = 0
我很好奇如果repmat(或另一个安装在内部的Matlab函数)可以加快的这部分代码:
为j = 1: Nx
utilde = linsolve ((:,:, j)、b (:, j));% \ b
Uhat (j) = utilde。';
结束
是j绝对必要的for循环或可以删除吗?