2012-02-21 73 views
1

我有一个ASCII文件,其中包含许多在地震解释软件中创建的曲面。它们是顶部表面和底部表面之间的一系列插值曲面。族是所有曲面都在常规的网格中的每个点进行采样。 文件结构为: X Y Z1 Z2 ..... Zn 其中X,Y是所有表面共有的坐标向量,Z1,Z2,...,Zn是表面。 我想在Matlab中导入文件并将每个单独的曲面保存到它自己的文件XYZ中。在Matlab中矢量化代码

假设数据导入并存储在变量“数据”,这个代码的工作:

r=size(data,1); 
c=size(data,2)-2; 
temp(:,1)=data(:,1); 
temp(:,2)=data(:,2); 
for i = 1:c 
    temp(:,3)=data(:,i+2); 
    tempname = ['proportional_',num2str(i*5-5),'ms','.txt']; % naming reflects the 
                  % fact that surfaces 
                  % are in two way travel 
                  % time and that median 
                  % distance between each 
                  % two surfaces is ~ 5 
                  % milliseconds 
    save (tempname,'temp','-ASCII','-TABS'); 
end                                         
clear r c temp tempname i 
clc 

我想通过采取尽可能多的它可能出来的for循环向量化的代码。我认为这样做的保存命令可能是不可能的,但也许其他两条线可以。我的感觉是我应该使用单元阵列或者结构,但我想不出正确的语法。 任何想法?谢谢

+0

如果你有一个ND数组,'data'的格式:'XY Z1 Z2 ...'做它的零垫'X'和'Z''将始终有'numel(X)* numel(Y)'值? – macduff 2012-02-21 21:07:57

+0

我不确定我是否理解这个问题。数据是一个二维数组,其中每个X,Y,Z1,...,Zn是一列 – MyCarta 2012-02-21 23:29:15

回答

2

这里是你可以做什么:

temp = arrayfun(@(x) data(:,[1 2 x]), 3:size(data,2), 'UniformOutput',0); 
arrayfun(@(x) dlmwrite(strcat('proportional_',num2str(x*5-5),'ms.txt'), ... 
     temp{x}, '\t'), 1:numel(temp)); 
+0

我会尽早尝试这个(并试图理解它)。会回来。谢谢! – MyCarta 2012-02-21 23:31:09

+0

Yowza。 +1 ...好... ...一些东西。 – Pursuit 2012-02-22 04:19:16