我想创建一个MATLAB函数来从另一个目录中的文件导入数据并使它们适合给定的模型,但是因为需要过滤数据(文件中不同位置的“捶打”数据,例如测量在分析的动作开始之前没有任何东西)。
因此,包含用于拟合的数据的向量最终具有不同的长度,因此我无法将它们返回到矩阵中(例如,我的函数中的x)。我该如何解决这个问题?
我有很多数据文件,所以我不想使用“手动”方法。我的功能如下。欢迎所有人和建议。
datafit.m
function [p, x, y_c, y_func] = datafit(pattern, xcol, ycol, xfilter, calib, p_calib, func, p_0, nhl)
datafiles = dir(pattern);
path = fileparts(pattern);
p = NaN(length(datafiles));
y_func = [];
for i = 1:length(datafiles)
exist(strcat(path, '/', datafiles(i).name));
filename = datafiles(i).name;
data = importdata(strcat(path, '/', datafiles(i).name), '\t', nhl);
filedata = data.data/1e3;
xdata = filedata(:,xcol);
ydata = filedata(:,ycol);
filter = filedata(:,xcol) > xfilter(i);
x(i,:) = xdata(filter);
y(i,:) = ydata(filter);
y_c(i,:) = calib(y(i,:), p_calib);
error = @(par) sum(power(y_c(i,:) - func(x(i,:), par),2));
p(i,:) = fminsearch(error, p_0);
y_func = [y_func; func(x(i,:), p(i,:))];
end
end
答案 0 :(得分:1)
我能想到两种策略:
答案 1 :(得分:0)
如果内存不是主要问题,请尝试使用不同的值填充向量,例如NaN或Inf - 任何根据物理上下文在测量中找不到的值。在为矩阵(*)分配内存之前,可能需要确定最长的数据集。这样,您可以使用大小相同的矩阵,并轻松忽略"空数据"稍后的。
(*)想法......首先根据最大文件的大小分配内存。填写例如为NaN' S
matrix = zeros(length(datafiles), longest_file_line_number) .* NaN;
然后运行你的功能。确定最长连续数据集的长度。
new_max = length(xdata(filter));
if new_max > old_max
old_max = new_max;
end
matrix(i, length(xdata(filter))) = xdata(filter);
在函数返回之前相应地裁剪矩阵......
matrix = matrix(:, 1:old_max);