从txt文件MATLAB中读取N个整数

时间:2015-09-20 10:34:04

标签: matlab readfile data-fitting

我尝试使用MATLAB编写脚本,该脚本从txt文件中读取(其中100*3个元素写在一列中)。我想一次读取它们100元素并应用拟合指数函数。这就是我写的:

defaultPath = 'my/default/path/';    
prompt = 'file name? ';    
fileName = input(prompt,'s');    
fullPath = strcat(defaultPath,fileName);    
fileID = fopen(fullPath);    
for h = 1:3
    buff = textscan(fileID, '%d', 100);
    y=buff';
    x = zeros([100, 1]);
    for j = 1:100
        x(j,1) = j;
    end
    f = fit(x,y,'exp1');
    plot(f,x,y);
end

但它给了我这个错误:

X and Y must have the same number of rows.

2 个答案:

答案 0 :(得分:1)

您的主要问题可能是fit的两个输入向量的形状不同:一个是size [100 1],另一个是[1 100],即一个是列矢量和另一个是一排。我建议这个:

defaultPath = 'my/default/path/';

prompt = 'file name? ';

fileName = input(prompt,'s');

fullPath = strcat(defaultPath,fileName);

fileID = fopen(fullPath);

for h = 1:3
    buff = textscan(fileID, '%d', 100);
    y=buff{1}';
    x = 1:length(y);
    f = fit(x,y,'exp1');
    figure; %open new window for plotting each slice of the data
    plot(f,x,y);
end

fclose(fileID);

请注意,我在绘图之前添加了figure调用,以便将3组数据绘制在单独的图形上(否则默认行为是每个plot覆盖前一个figure相同的x

我还更改了y的定义,使其明确匹配y的长度,这样可以防止在读取出现问题时出现一些错误,using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { static HashSet<string> oldDirFiles = new HashSet<string>(); static HashSet<string> newDirFiles = new HashSet<string>(); static string oldDir = "C:\\New Folder"; static string newDir = "C:\\New Folder 2"; static System.Threading.ManualResetEvent resetEvent = new System.Threading.ManualResetEvent(false); static void Main(string[] args) { System.IO.FileSystemWatcher watcher = new System.IO.FileSystemWatcher(); watcher.Path = newDir; watcher.NotifyFilter = NotifyFilters.DirectoryName | NotifyFilters.FileName; watcher.IncludeSubdirectories = true; watcher.Filter = "*.*"; watcher.Created += watcher_Created; watcher.Changed += watcher_Changed; watcher.Renamed += watcher_Renamed; watcher.EnableRaisingEvents = true; //get all files in old directory var oldFiles = Directory.GetFiles(oldDir, "*.*", SearchOption.AllDirectories); foreach (var file in oldFiles) oldDirFiles.Add(file); resetEvent.WaitOne(); //now launch the directory copy //then you have to check if in the meaning time, new files were added or renamed //that could be done also with a watcher in the old directory } static void watcher_Renamed(object sender, RenamedEventArgs e) { throw new NotImplementedException(); } static void watcher_Changed(object sender, FileSystemEventArgs e) { throw new NotImplementedException(); } static void watcher_Created(object sender, FileSystemEventArgs e) { //check if the copied file was in the old directory before starting if (oldDirFiles.Contains(e.FullPath.Replace(newDir, oldDir))) { newDirFiles.Add(e.FullPath); //if all the files have been copied, the file count will be the same in the two hashsets //the resetevent.Set() signal the waiting thread and the program can proceed if (newDirFiles.Count == oldDirFiles.Count) resetEvent.Set(); } } } } 具有非常重要的长度。无论如何,最好尽可能避免使用魔术数字并根据其他数字定义所有内容。

答案 1 :(得分:0)

您可以按如下方式使用csvread:

f = csvread(STRING_OF_FILE_NAME);

f将是一个包含数据的矩阵。