我正在开发一个开源代码,它应该有一个1D数组的网格文件。我通过Matlab中的MESHGRID创建网格,然后使用FOR循环来堆叠数据列以创建文件。由于FOR循环,它需要很长时间。任何人都可以建议我一个更好的算法来解决这个问题,这将加快我的过程。提前谢谢
clear all;
clc;
close all;
th = (0:0.5:360)*pi/180;
r = 0:0.2:1;
z = 5:.01:15;
[TH,R,Z] = meshgrid(th,r,z);
[X,Y,Z1] = pol2cart(TH,R,Z);
L1 = length(X(:,1,1))
L2 = length(Y(1,:,1))
L3 = length(Z1(1,1,:))
T = 1;
for i = 1:1:L1
for j = 1:1:L2
for k = 1:1:L3
M(T,1) = X(i,j,k) ;
M(T,2) = Y(i,j,k) ;
M(T,3) = Z1(i,j,k) ;
T = T+1
end
end
end
dlmwrite('hpts.in',M,'precision','%2.2f','delimiter',' ','-append');
答案 0 :(得分:0)
不只是:
M = [X(:), Y(:), Z1(:)]
虽然从技术上得到相同的结果,但你首先要计算第三个维度,因为Matlab和(:)
技术是列专业,即首先沿着维度1进行计数,所以你需要重新排序你的维度所以使用permute
以及(:)
或reshape
。使用reshape
,您可以使用匿名函数来解决问题:
columize = @(A)reshape(permute(A, [3,2,1]), [],1,1)
M = [columize(X), columize(Y), columize(Z1)]
答案 1 :(得分:0)
入侵pol2cart.m
并使用自定义版本的meshgrid
以使用此代码获得所需结果 -
%// Inputs
th = (0:0.5:360)*pi/180;
r = 0:0.2:1;
z = 5:.01:15;
%// Start processing
Mcol1 = cos(th)'*r; %//'
Mcol1 = repmat(Mcol1(:).',numel(z),1); %//'
Mcol2 = sin(th)'*r; %//'
Mcol2 = repmat(Mcol2(:).',numel(z),1); %//'
M = [Mcol1(:) Mcol2(:) repmat(z(:),numel(r)*numel(th),1)];
dlmwrite('hpts.in',M,'precision','%2.2f','delimiter',' ','-append');
这似乎比 6x
更快,而不是您在我的系统上预先分配M
所获得的代码。
此外,您可以将th
的转置存储到变量中,并在使用这些转置值的两个地方使用它 - cos(th)'
和sin(th)'
,这样就必须加快速度