2013-10-22 65 views
1

所以我想調整大小爲72x144x156的矩陣爲180x360x156網格。我可以試着用這個命令來做:resizem(precip,2.5)。前兩個維度是經度和緯度,而最後維度是時間。我不想調整時間。如何調整第三維的矩陣大小?

如果矩陣大小爲72x144,則此方法有效。但它不適用於尺寸72x144x156。有沒有辦法調整前兩個維度而不調整第三個維度?

此外,什麼是最快的方式來做到這一點(最好沒有for循環)。如果for循環是必要的,那很好。

+2

您是否嘗試過使用不會更改時間的網格['interp3'](http://www.mathworks.com/help/matlab/ref/interp3.html)? – chappjc

回答

1
D= %existing matrix 
scale=2.5; 
E=zeros(size(D,1)*2.5,size(D,2)*2.5,size(D,3)) 
for depth=1:size(D,3) 
    E(:,:,depth)=resizem(D(:,:,depth),scale) 
end 

這應該提供預期的輸出。

+0

真棒 - 謝謝!你知道是否有可能以比for循環更高的計算效率來實現這一點? – InquilineKea

+1

我目前沒有ml可用,但是這應該工作:'fk = @(depth)(resizem(D(:::depth),scale))''E = arrayfun(fk,(1:size( D,3))' 由於循環內的步驟相對較大,已經進行了矢量化處理,所以我不期待相關的改進。 – Daniel

2

我暗示我的評論,但可以使用interp3這樣的:

outSize = [180 360 156]; 
[nrows,ncols,ntimes] = size(data); 
scales = [nrows ncols ntimes] ./ outSize; 

xq = (1:outSize(2))*scales(2) + 0.5 * (1 - scales(2)); 
yq = (1:outSize(1))*scales(1) + 0.5 * (1 - scales(1)); 
zq = (1:outSize(3))*scales(3) + 0.5 * (1 - scales(3)); 
[Xq,Yq,Zq] = meshgrid(xq,yq,zq); 
dataLarge = interp3(data,Xq,Yq,Zq); 

但如果你知道你不希望的時間點之間進行插值,這個問題被簡化,以便您可以循環在丹尼爾R的答案。雖然,這個答案不會增加時間點的數量。

+0

很酷 - 非常感謝你的回答!你知道這個方法比他的答案中包含的for循環更省時嗎? – InquilineKea

+2

老實說,我認爲for循環在這種情況下可能沒有什麼大不了的,因爲180 * 360比156大得多。但是你必須確定兩者的時間。我沒有'resizem'來試試他,但是你可以拿着我的'interp2'來查看。 – chappjc

1
% s = zeros(72, 144, 156); 
    % whos s; 
    % news = resize2D(s, 2.5); 
    % whos news; 

    function [result] = resize2D(input, multiply) 
     [d1, d2, d3] = size(input); 
     result = zeros(d1*multiply, d2*multiply, d3); 
    end 
+0

嗯......我想你可能會錯過一個步驟 – chappjc

+1

2 upvotes? !?它甚至不是4月1日! – chappjc

+0

也許我對「resize」的理解與你的不一樣......我沒有resizem的「映射工具箱」,不知道它的定義是什麼 –