在Matlab中矢量化代码

时间:2012-02-21 21:00:20

标签: matlab for-loop save vectorization

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

假设数据已导入并存储在变量“data”中,则此代码可以完成以下任务:

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循环中获取代码来对此代码进行矢量化。我认为为save命令执行它可能是不可能的,但也许其他两行可以。我的感觉是我应该使用单元格数组或结构,但我想不出正确的语法。 有任何想法吗?谢谢

1 个答案:

答案 0 :(得分: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) );