【问题标题】:Slicing and assigning values to a 3D array in matlab在matlab中对3D数组进行切片和赋值
【发布时间】:2015-11-22 15:29:01
【问题描述】:

我尝试为 2D 数组的前 2 个维度分配值,同时保持第三个维度固定。但是我遇到了一个错误。

Assignment has fewer non-singleton rhs dimensions than non-singleton subscripts

参见下面的代码 sn-p(注意我使用来自here 的 allcomb())。

知道为什么以及如何解决吗?

A = zeros(2, 94, 10);
combs = allcomb(1:2,1:94);
A(combs(:,1), combs(:,2), 1) = 1:(2*94);

请注意,我的意图是写一个向量化的形式:

A = zeros(2, 94, 10);
combs = allcomb(1:2,1:94)
vals = 1:(2*94);
for k=1:length(vals)
    A(combs(k,1), combs(k,2), 1) = vals(k);
end

【问题讨论】:

    标签: arrays matlab slice


    【解决方案1】:

    我找到了我正在寻找的简短而优雅的实现,使用 sparse() 初始化:

    A = zeros(2, 94, 10);
    combs = allcomb(1:2,1:94);
    vals = 1:(2*94);
    
    %% Here it is: 
    A(:,:,1) = sparse(combs(:,1), combs(:,2), vals);
    

    【讨论】:

      【解决方案2】:

      你可以试试这样的:

      A = zeros(2, 94, 10);
      B = A;
      combs = allcomb(1:2, 1:94);
      vals = 1:(2*94);
      for k=1:length(vals)
            A(combs(k, 1), combs(k, 2), 1) = vals(k);
      end
      
      % here it starts
      val = repmat(1:94, 94, 2);
      B(combs(:, 1), combs(:, 2), 1) = [val; val + 94];
      
      isequal(A, B)   % returns 1
      

      这应该会给你想要的结果。

      【讨论】:

        【解决方案3】:

        等式右侧的rhs 需要与lhs 具有相同的维度。在这种情况下,您尝试将 N x 1 向量分配给 2 x N x 1 数组。

        试试,

        A = zeros(2, 94, 10);
        combs = allcomb(1:2,1:94);
        val = (1:2*94)';
        A(combs(:,1), combs(:, 2), 1) = [val, val];
        

        祝你好运!

        【讨论】:

        • 谢谢,但它不起作用。 [val, val] 是 Nx2,而不是 NxN。但无论如何,我只想分配 N 个值,因此将其复制到 NxN 个分配太昂贵了。
        • 修正了一个错字。梳子的尺寸是多少?从上下文来看,它似乎是 94*94 x 2,在这种情况下,do give 应该起作用。无论如何,如果您添加更多上下文代码,它会更容易提供帮助。
        猜你喜欢
        • 2015-10-15
        • 2015-10-15
        • 2023-04-03
        • 1970-01-01
        • 2017-04-10
        • 2021-01-29
        • 2021-01-15
        • 1970-01-01
        • 2022-01-07
        相关资源
        最近更新 更多