MATLAB - 我如何(优雅地)插入矩阵?

时间:2012-05-31 22:29:50

标签: matlab interpolation

假设我有一个包含3个元素的单元格数组;第一个和第三个单元格是矩阵,而第二个单元格是空的:

>> P
P = 
  [3x8 double]    []    [3x8 double]

我可以通过对矩阵中的每个单独元素进行插值来填充第二个矩阵,但是肯定必须有一种方法可以一次性完成这个操作吗?

编辑:平均值肯定会对P.有效。但是假设我有类似的东西

>> Q
Q = [3x8 double]    [3x8 double]     [3x8 double]    []    []    [3x8 double]

因此,鉴于我的四个已知矩阵,我可以使用更高级的插值(如样条曲线)来填充缺失的矩阵。

3 个答案:

答案 0 :(得分:4)

您可以在对INTERP1的单个函数调用中执行所有插值,但它需要将数据设置为所需的形状,然后在完成后返回:

%# cell array of matrices (some are missing)
sz = [3 8];         %# all of same size
Q = {ones(sz), [], 3*ones(sz), [], [], 6*ones(sz)};

%# indices of missing matrices
idx = ~cellfun(@isempty,Q);
x = 1:numel(Q);

%# merge cells into a multidimensional matrix, call INTERP1, then divide back
QQ = Q(idx);
QQ = permute(cat(3,QQ{:}), [3 1 2]);
QQ = interp1(x(idx), QQ, x);            %# one call to interpolation function
QQ = reshape(num2cell(permute(QQ, [2 3 1]), [1 2]), 1,[]);

请记住,矢量化有时会以可读性为代价......

答案 1 :(得分:2)

这样的东西适用于你的玩具箱:

l = length(P{1}(:)); m = size(P{1}, 1); n = size(P{1}, 2);
myfun = @(x) interp1([1 3], [P{1}(x) P{3}(x)], 2)
P{2} = reshape(arrayfun(myfun, 1:l), m, n);

更通用的代码(已验证!! )。您可以指定在一个interp1调用中使用哪种插值类型:

[m, n] = size(P{1}); l = m*n;
avbl = find(not(cellfun('isempty', P)));
missing = find(cellfun('isempty', P));

extractor = @(k) cellfun(@(x, k) x(k), {P{avbl}}, cellmat(1, length(avbl), 1, 1, k))
myfun = @(x) interp1(avbl, extractor(x), missing)
intermediate = reshape(arrayfun(myfun, 1:l, 'UniformOutput', false), m, n);
ext2 = @(k) cellfun(@(p) p(k), intermediate);
P(missing) = arrayfun(ext2, 1:length(missing), 'UniformOutput', false);

如果您想让我解释一些部分,请告诉我。它基本上只是调用cellfun几次,然后重塑输出。

答案 2 :(得分:0)

你的意思是:

     p{2} = (p{1} + p{3}) / 2;  % note the curly braces