1

したがって、サイズが 72x144x156 のマトリックスを 180x360x156 グリッドにサイズ変更したいと思います。このコマンドでそれを試みることができます: resizem(precip,2.5). 最初の 2 つの次元は緯度と経度で、最後の次元は時間です。時間のサイズを変更したくありません。

これは、マトリックスのサイズが 72x144 の場合に機能します。ただし、72x144x156 のサイズでは機能しません。3番目のサイズを変更せずに最初の2つの次元のサイズを変更する方法はありますか?

また、これを行う最速の方法は何ですか (できれば for ループなしで)。for ループが必要な場合は、それで問題ありません。

4

3 に答える 3

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

ただし、時点間で補間したくないことがわかっている場合、問題は単純化されるため、Daniel Rの回答のようにループできます。ただし、この回答によって時点の数が増えることはありません。

于 2013-10-22T21:23:38.550 に答える
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
于 2013-10-22T21:41:36.990 に答える
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

これにより、期待される出力が得られるはずです。

于 2013-10-22T21:23:51.943 に答える