【问题标题】:How do I resize a Matlab matrix with a 3rd dimension?如何调整具有 3 维的 Matlab 矩阵的大小?
【发布时间】:2013-10-22 21:13:09
【问题描述】:

所以我想将大小为 72x144x156 的矩阵调整为 180x360x156 网格。我可以尝试使用以下命令:resizem(precip,2.5)。前两个维度是纬度和经度,而最后一个维度是时间。我不想调整时间大小。

如果矩阵大小为 72x144,则此方法有效。但它不适用于尺寸 72x144x156。有没有办法调整前两个维度的大小而不调整第三个维度的大小?

另外,最快的方法是什么(最好没有 for 循环)。如果需要一个 for 循环,那很好。

【问题讨论】:

  • 您是否尝试过将interp3 应用于不改变时间的网格?

标签: matlab interpolation


【解决方案1】:

我在评论中暗示过,但可以像这样使用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 的回答那样循环。虽然,这个答案不会增加时间点的数量。

【讨论】:

  • 太酷了 - 非常感谢您的回答!您知道这种方法是否比他的答案中包含的 for 循环更省时吗?
  • 老实说,我认为在这种情况下,for 循环可能没什么大不了的,因为 180*360 比 156 大得多。但是您必须确定这两者的时间。我没有resizem 来试试他的,但你可以拿我的在interp2 上循环看看。
【解决方案2】:
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

这应该提供预期的输出。

【讨论】:

  • 太棒了-谢谢!你知道是否有可能以一种比 for 循环计算效率更高的方式来做到这一点?
  • 我目前没有可用的 ml,但这应该可以:fk=@(depth)(resizem(D(:,:,depth),scale)) E=arrayfun(fk,(1:size(D,3)) 由于循环中相对较大的步骤已经矢量化,我不希望有相关的改进。
【解决方案3】:
    % 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

【讨论】:

  • 嗯...我想你可能错过了一步。
  • 可能我对“resize”的理解和你不一样……我没有resizem的“映射工具箱”,不知道它的定义是什么。
  • 问题的核心是插值。输出矩阵的内容要根据输入的内容,而不只是result = zeros(size(input,1)*multiply, size(input,2)*multiply, size(input,3));对不起我的cmets...
猜你喜欢
  • 1970-01-01
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 2012-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-06
相关资源
最近更新 更多