Parfor loop with 3D structure matrix
2 次查看(过去 30 天)
显示 更早的评论
Hello
I have the following 3 dimensional vector of velocity field with a dimension of 4697×1×1600 which I am trying to put it into a matrix of 77×77×1600. There is no problem with this code but the loop takes three minutes to run and it is a long time for running only one simple part of my code. I have problem using parfor with this current code since it is a structure data and it seems like parfor does not accept structures. I thought maybe the problem is because of indexing or maybe the three dimensional matrix?
Somebody could help me to begin somewhere?
I really appreciate any help in advance.
clear
clc
% Generating the random velocity vector field
vel.V_pix1D.Data1 = rand(4697,1,1600);
vel.V_pix1D.Data2 = rand(4697,1,1600);
vel.V_pix1D.Data3 = rand(4697,1,1600);
vel.V_pix1D.Data4 = rand(4697,1,1600);
vel.U_pix1D.Data1 = rand(4697,1,1600);
vel.U_pix1D.Data2 = rand(4697,1,1600);
vel.U_pix1D.Data3 = rand(4697,1,1600);
vel.U_pix1D.Data4 = rand(4697,1,1600);
% Generating the spatial vector field
x.x_pix1D.Data1 = rand(4697,1,1600);
x.x_pix1D.Data2 = rand(4697,1,1600);
x.x_pix1D.Data3 = rand(4697,1,1600);
x.x_pix1D.Data4 = rand(4697,1,1600);
y.y_pix1D.Data1 = rand(4697,1,1600);
y.y_pix1D.Data2 = rand(4697,1,1600);
y.y_pix1D.Data3 = rand(4697,1,1600);
y.y_pix1D.Data4 = rand(4697,1,1600);
% Preallocation
vel.U_pix2D.Data1 = zeros(77,77,1600);
vel.V_pix2D.Data1 = zeros(77,77,1600);
vel.U_pix2D.Data2 = zeros(77,77,1600);
vel.V_pix2D.Data2 = zeros(77,77,1600);
vel.U_pix2D.Data3 = zeros(77,77,1600);
vel.V_pix2D.Data3 = zeros(77,77,1600);
vel.U_pix2D.Data4 = zeros(77,77,1600);
vel.V_pix2D.Data4 = zeros(77,77,1600);
x.x_pix2D.Data1 = zeros(77,77,1600);
x.x_pix2D.Data2 = zeros(77,77,1600);
x.x_pix2D.Data3 = zeros(77,77,1600);
x.x_pix2D.Data4 = zeros(77,77,1600);
y.y_pix2D.Data1 = zeros(77,77,1600);
y.y_pix2D.Data2 = zeros(77,77,1600);
y.y_pix2D.Data3 = zeros(77,77,1600);
y.y_pix2D.Data4 = zeros(77,77,1600);
n = 0;
imax = 77;
jmax = 61; %61
kmax = 1600;
tic
for k = 1:kmax
for j = 1:jmax
for i = 1:imax
n = n+1;
vel.U_pix2D.Data1(j,i,k) = vel.U_pix1D.Data1(n,1,k); vel.V_pix2D.Data1(j,i,k) = vel.V_pix1D.Data1(n,1,k);
vel.U_pix2D.Data2(j,i,k) = vel.U_pix1D.Data2(n,1,k); vel.V_pix2D.Data2(j,i,k) = vel.V_pix1D.Data2(n,1,k);
vel.U_pix2D.Data3(j,i,k) = vel.U_pix1D.Data3(n,1,k); vel.V_pix2D.Data3(j,i,k) = vel.V_pix1D.Data3(n,1,k);
vel.U_pix2D.Data4(j,i,k) = vel.U_pix1D.Data4(n,1,k); vel.V_pix2D.Data4(j,i,k) = vel.V_pix1D.Data4(n,1,k);
x.x_pix2D.Data1(j,i,k) = x.x_pix1D.Data1(n,1,k);y.y_pix2D.Data1(j,i,k) = y.y_pix1D.Data1(n,1,k);
x.x_pix2D.Data2(j,i,k) = x.x_pix1D.Data2(n,1,k);y.y_pix2D.Data2(j,i,k) = y.y_pix1D.Data2(n,1,k);
x.x_pix2D.Data3(j,i,k) = x.x_pix1D.Data3(n,1,k);y.y_pix2D.Data3(j,i,k) = y.y_pix1D.Data3(n,1,k);
x.x_pix2D.Data4(j,i,k) = x.x_pix1D.Data4(n,1,k);y.y_pix2D.Data4(j,i,k) = y.y_pix1D.Data4(n,1,k);
end
end
n = 0;
end
toc
0 个评论
回答(1 个)
KSSV
2019-1-10
No loops and parfor required...have a look on reshape.
A = rand(4697,1,1600) ;
nx = 77 ; ny = 61 ;
nt = 1600 ;
B = reshape(A,nx,ny,nt) ;
C = zeros(77,77,nt) ;
C(1:nx,1:ny,:) = B ;
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Loops and Conditional Statements 的更多信息
产品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!