所以我想将大小为 72x144x156 的矩阵调整为 180x360x156 网格。我可以尝试用这个命令来做到这一点:resizem(precip,2.5)
。前两个维度是纬度和经度,而最后一个维度是时间。我不想调整时间大小。
如果矩阵大小为 72x144,则此方法有效。但它不适用于尺寸 72x144x156。有没有办法调整前两个维度的大小而不调整第三个维度的大小?
此外,最快的方法是什么(最好没有 for 循环)。如果需要一个 for 循环,那很好。
所以我想将大小为 72x144x156 的矩阵调整为 180x360x156 网格。我可以尝试用这个命令来做到这一点:resizem(precip,2.5)
。前两个维度是纬度和经度,而最后一个维度是时间。我不想调整时间大小。
如果矩阵大小为 72x144,则此方法有效。但它不适用于尺寸 72x144x156。有没有办法调整前两个维度的大小而不调整第三个维度的大小?
此外,最快的方法是什么(最好没有 for 循环)。如果需要一个 for 循环,那很好。
我在评论中暗示,但可以像这样使用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 的回答那样循环。虽然,这个答案不会增加时间点的数量。
% 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
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
这应该提供预期的输出。