2012-05-31 35 views
2

假設我有一個有3個元素的單元陣列;所述第一和第三單元是矩陣,而第二個是空的:MATLAB - 我如何(優雅地)插入矩陣?

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

我所用的第二矩陣通過內插在矩陣中的每個個體元件填充料,但肯定必須有一種方式,一個執行此射擊?

編輯:平均肯定會爲P.工作,但假設我有類似

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

所以給我的四個已知矩陣,我可以用一個票友插值(如齒輪)填寫缺少矩陣。

+1

如果第一個和第三個單元格中(1,1)的元素分別是1和2,那麼是否希望對它們進行平均使得第二個單元格中的(1,1)將會是1.5?或者你的意思是'插入'更有趣嗎? – tmpearce

+0

@tmpearce平均值肯定會。有時候矩陣中的數據不一定是線性縮放的,我可能有其他矩陣可以從中拉出。我可以編輯問題以顯示更一般的情況。 –

+0

還有一個問題:矩陣中每個位置的1-d插值是否是所需的結果?即看所有(1,1)都將是確定(1,1)索引中缺失值所需的全部內容? – tmpearce

回答

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,[]); 

只要記住向量化有時正值可讀性的代價...

+0

我只需要一次對我已經生成的一些數據執行此操作。該計劃是永遠不必再次生成這些數據,所以希望我是唯一一個必須閱讀該代碼的人。:) –

+1

@DangKhoa:好的,你被警告了:) – Amro

+0

這可以調整處理外推以及?所以如果第一個矩陣是空的,但其餘的都可以,那麼它也可以填充這些數據。我意識到外推並不是最穩定的操作,但我的數據應該接近線性。 –

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幾次,然後重塑輸出。

+0

突然間我是提醒我爲什麼決定不學習MATLAB。 :) – Codeman

+0

哈哈..對我來說這只是顯示了令人敬畏的MATLAB是如何:P – Ansari

+0

我在開玩笑,當然...我的學位是在歐洲經委會,我學了MATLAB,我只是更習慣於ALGOL-60/C風格語言 – Codeman

0

你的意思是:

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