如何存储和重用在for循环系数
10视图(30天)
显示旧的评论
Matlab代码的子程序重复执行一个for循环的两倍。大型模拟测试时,这个子程序叫做超过10 ^ 6次。我很好奇如果我可以改变/重用子程序的一部分,这样我就可以提高性能。
我原来的Matlab代码(测试数据)如下所示。
%测试数据
clc;清晰的所有;
M = 30;
N = 30;
Nx = 32;
f_n_m =兰德(Nx、N + 1 M + 1);
ε= 0.3;
δ= 0.4;
SumType =兰迪(3,1);
f = 0 (Nx, 1);
多项式系数= 0 (N + 1, M + 1);
%原始实现
为j = 1: Nx
%这两个for循环可以执行一次,而不是Nx倍?
为r = 0: N
为s = 0: M
多项式系数(r + 1, s + 1) = f_n_m (j r + 1, s + 1);
结束
结束
如果(SumType = = 1)
%我的代码调用分离子例程需要多项式系数的值。
%出于测试目的,我把f (j) =测试数据。这三个如果
%在我的代码语句调用外部函数。
f (j) =多项式系数(j) *ε*δM * N *;
elseif(SumType = = 2)
f (j) = 2 *多项式系数(j) *ε*δM * N *;
elseif(SumType = = 3)
f (j) = 3 *多项式系数(j) *ε*δM * N *;
结束
结束
我的第一个(坏的管理者)的想法是上面的代码更改为下面的代码。
f2 = 0 (Nx, 1);
coeff2 = 0 (N + 1, M + 1);
%将两个for循环
为j = 1: Nx
为r = 0: N
为s = 0: M
coeff2 (r + 1, s + 1) = f_n_m (j r + 1, s + 1);
结束
结束
结束
%然后运行原来的for循环
为j = 1: Nx
如果(SumType = = 1)
f2 (j) = coeff2 (j) *ε*δM * N *;
elseif(SumType = = 2)
f2 (j) = 2 * coeff2 (j) *ε*δM * N *;
elseif(SumType = = 3)
f2 (j) = 3 * coeff2 (j) *ε*δM * N *;
结束
结束
%,这给了不同的答案,因为违背一个f (j)
% j值而f2 (j)计算的所有值。
diff =规范(f-f2正)%大
我很好奇如果有更高效的写作方式
为j = 1: Nx
%开始内部两个for循环
为r = 0: N
为s = 0: M
多项式系数(r + 1, s + 1) = f_n_m (j r + 1, s + 1);
结束
结束
%结束内心的两个for循环
如果(SumType = = 1)
f (j) =%外部函数多项式系数,ε,三角洲,N, M
elseif(SumType = = 2)
f2 (j) =%不同的外部函数多项式系数,ε,三角洲,N, M
elseif(SumType = = 3)
f2 (j) =%的第三个外部函数多项式系数,ε,三角洲,N, M
结束
结束
这样循环的内部双只计算一次,而不是Nx倍。这是一个限制函数是这样写的吗?
0评论
接受的答案
每•艾萨克森
2021年7月23日
警告:我不完全理解你的代码和我说可能不是你真正的相关项目。
“%这两个for循环可以执行一次,而不是Nx倍?”
简短的回答是否定的,因为
多项式系数
是2 d和
f_n_m
是3 d的。也许,你可以
多项式系数
3 d。取决于你如何使用
多项式系数。
“f (jj) =多项式系数(jj) * *δε* N * M;”
是什么
多项式系数(jj)
应该返回?这是线性索引,返回一个标量。
建议:更换两个for循环
alt_coeff = f_n_m (:,:, jj);。
请注意,我有修改的索引
f_n_m
这
jj
是第三个索引。运行函数
cssm1 ()
与
概要文件()。alt_coeff
大大提高了速度。
cssm1
函数出= cssm1
%测试数据
% clc;清除所有;
M = 30;
N = 30;
Nx = 32;
f_n_m =兰德(N + 1, M + 1, Nx);
ε= 0.3;
δ= 0.4;
SumType =兰迪(3,1);
f = 0 (Nx, 1);
多项式系数= 0 (N + 1, M + 1);
%原始实现
为jj = 1: Nx
%这两个for循环可以执行一次,而不是Nx倍?
为r = 0: N
为s = 0: M
多项式系数(r + 1, s + 1) = f_n_m (r + 1, s + 1, jj);
结束
结束
alt_coeff = f_n_m (:,:, jj);
如果(SumType = = 1)
%我的代码调用分离子例程需要多项式系数的值。
%出于测试目的,我把f (j) =测试数据。这三个如果
%在我的代码语句调用外部函数。
f (jj) =多项式系数(jj) *ε*δM * N *;
elseif(SumType = = 2)
f (jj) = 2 *多项式系数(jj) *ε*δM * N *;
elseif(SumType = = 3)
f (jj) = 3 *多项式系数(jj) *ε*δM * N *;
结束
结束
了=“快乐的结局”;
结束