2015-06-07 53 views
0

在MATLAB中我有3 x nn是隨機數)矩陣。爲n=13例如:插值並替換爲零

M = [40, 0, 0, 0, 41, 0, 0, 0, 0, 0, 41.6, 0, 20; 
    20, 0, 0, 0, 23, 0, 0, 0, 0, 0, 23, 0, 189; 
    102, 0, 0, 0, 192, 0, 0, 0, 0, 0, 96, 0, 21]; 

零的兩個非零號碼之間的每個行中的數字是隨機的,但這個數總是行之間是相同的。我想插入像這樣的每一行:

Minter = [40, 40.25, 40.5, 40.75, 41, 41.1, 41.2, 41.3, 41.4, 41.5, 41.6, 30.8, 20; 
      20, 20.75, 21.5, 22.25, 23, 23, 23, 23, 23, 23, 23, 106, 189; 
      102, 124.5, 147, 169.5, 192, 176, 160, 144, 128, 112, 96, 58.5, 21]; 

所以我想用線性插值方法獲得的數字替換零。

我寫了我自己的功能來做到這一點。我使用MATLAB函數find來搜索>0的數字索引,然後根據兩個索引之間的差異(來自find函數)並根據第一個左右非零數字(從原始矩陣),我計算這兩個非零數字之間的數字,並用原始矩陣中的這些數字替換零。我正在分別處理每一行。

此方法工作正常,但速度不是很快。 MATLAB中有更快的方法嗎?我嘗試了interp1函數,但沒有取得太大的成功。

+0

那麼,我寫的幫助你嗎?它有用嗎? – rayryeng

+0

ECHO!回聲!..... e .... ch .... o。 – rayryeng

+0

我很抱歉遲到的答案!是的,它非常好用!非常感謝!!! – dejh

回答

3

是的,你仍然可以使用interp1,但你必須很聰明。注意你要分開插入矩陣的每一行,我們可以使用find,我們可以在矩陣的轉置處操作以找到非零的那些列主要位置。這很重要,因爲我們要插入每行的矩陣值,並且find按列主要順序工作。如果您想要對每行進行操作,則需要對矩陣進行轉置以獲得所需的效果。

完成之後,您可以使用這些索引以及矩陣轉置中非空作爲關鍵點的那些值,然後使用查找點,從1到最多在M填寫那些爲零的M的值。這隻會給我們一個一維數組,所以我們需要reshape這個矩陣,當我們完成時我們需要轉換回來。轉置仍然很重要,因爲reshape以列主要方式重塑矢量,所以最後一步可以確保我們獲得所有行中的所有內容。

做這樣的事情:

%// Your matrix 
M=[40, 0, 0, 0, 41, 0, 0, 0, 0, 0, 41.6, 0, 20; 
20, 0, 0, 0, 23, 0, 0, 0, 0, 0, 23, 0, 189; 
102, 0, 0, 0, 192, 0, 0, 0, 0, 0, 96, 0, 21]; 

%// New code 
Mt = M.'; %// Transpose 
ind = find(Mt); %// Find column-major indices 
Minter = interp1(ind, Mt(ind), 1:numel(M)); %// Interpolate per row 
Minter = reshape(Minter, size(M,2), size(M,1)).'; %// Reshape and transpose back 

我們得到:

Minter = 

    Columns 1 through 8 

    40.0000 40.2500 40.5000 40.7500 41.0000 41.1000 41.2000 41.3000 
    20.0000 20.7500 21.5000 22.2500 23.0000 23.0000 23.0000 23.0000 
    102.0000 124.5000 147.0000 169.5000 192.0000 176.0000 160.0000 144.0000 

    Columns 9 through 13 

    41.4000 41.5000 41.6000 30.8000 20.0000 
    23.0000 23.0000 23.0000 106.0000 189.0000 
    128.0000 112.0000 96.0000 58.5000 21.0000 

這與你的期望的輸出一致。