【问题标题】:MATLAB: vectors of different lengthMATLAB:不同长度的向量
【发布时间】:2012-12-04 22:47:46
【问题描述】:

我想创建一个 MATLAB 函数来从另一个目录中的文件导入数据并将它们拟合到给定模型,但是因为需要过滤数据(在文件的不同位置有“thrash”数据,例如测量在分析的运动开始之前什么都没有)。

因此,包含用于拟合的数据的向量最终具有不同的长度,因此我无法在矩阵中返回它们(例如,下面我的函数中的 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

样本数据: http://hastebin.com/mokocixeda.md

【问题讨论】:

  • 也许也可以发布一些示例数据。

标签: matlab octave


【解决方案1】:

我能想到两种策略:

  • 我会在vector of cells 中返回数据,其中各个单元格存储不同长度的向量。您可以像访问数组一样访问数据,但使用大括号:例如 c{1}=[1 2 3], c{2}=[1 2 10 8 5] c{3} = [ ]。
  • 您还可以在读取一行时过滤垃圾数据,前提是您的向量具有相同的长度。

【讨论】:

    【解决方案2】:

    如果内存不是主要问题,请尝试使用不同的值填充向量,例如 NaN 或 Inf - 任何在基于物理上下文的测量中找不到的值。在为矩阵 (*) 分配内存之前,您可能需要确定最长的数据集。这样,您可以使用相同大小的矩阵,并在以后轻松忽略“空数据”。

    (*) 思路...首先根据最大文件的大小分配内存。用例如填充它NaN的

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多