【问题标题】:Creating 3D array (Matlab)创建 3D 数组(Matlab)
【发布时间】:2016-09-03 12:02:16
【问题描述】:

我目前正在对冰盖动力学进行建模。我有一个循环计算 8760 小时(1:tmax)和 8 个不同位置(1:no_stations)的表面能量平衡。如下所示:

tau=0.5;
albedo=0.35;
c0=-90;
c1=10;

for i=1:tmax
    for e=1:no_stations
        psi(i,e) = tau*(1-albedo)*insol(i,4)+c0+c1*temp_stations(i,e);
    end
end

温度数据 (temp_stations) 是一个 8760x8 数组,其中 8 个位置对应 8760 小时的温度,而 insol(i,4) 是一个 8760x4 数组,其中第四列给出了日照随时间的演变.我的问题:我想创建一个额外的维度,一个 8760x8x61 数组,其中 c0 不是常数,而是在 -140 和 -80 之间变化:

c0=-140:1:-80;

我该怎么做?我尝试了一些方法,但似乎效果不佳。

谢谢!

【问题讨论】:

  • MATLAB 中的所有索引值都必须是>= 1。您必须将数组的第三维范围从 1 到 61 并减去 141。才能获得 c 的正确值。

标签: matlab loops multidimensional-array


【解决方案1】:

对于这种需要扩展的情况,可以引入bsxfunpermute 进行矢量化解决方案,就像这样 -

parte2 = bsxfun(@plus,permute(c0,[1,3,2]),c1*temp_stations);
psi_out = bsxfun(@plus,tau*(1-albedo)*insol(:,4),parte2);

如果你不 dig bsxfun 或者你只是想验证矢量化方法的结果,这里是等效的循环代码 -

for i=1:tmax
    for e=1:no_stations
        for k = 1:numel(c0)
            psi(i,e,k) = tau*(1-albedo)*insol(i,4)+c0(k)+c1*temp_stations(i,e);
        end
    end
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    相关资源
    最近更新 更多