从Meshgrid Matlab创建一个一列数组

3

我正在开发一个开源代码,需要有一个网格文件,该文件应是一个一维数组。我使用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');

1
作为第一步,预先分配 M。此外,您可以检查以下是否对您有效:M(:,1) = X(:) - rozsasarpi
2个回答

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)]

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');

这似乎比在我的系统上预分配M的代码快了6x倍。

此外,您可以将th的转置存储到一个变量中,并在使用这些转置值的两个位置使用它 - cos(th)'sin(th)',以进一步提高速度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接