【问题标题】:Reshaping cells: transform a 1xj cell with i observations into a 1xi cell with j observations重塑单元格:将具有 i 个观测值的 1xj 单元格转换为具有 j 个观测值的 1xi 单元格
【发布时间】:2018-09-09 20:57:02
【问题描述】:

我想知道重塑单元格的最佳做法。

假设我有一个 1x5 单元格,每个单元格中有 2 个观察值。在我的示例中,我将这个单元格 VAR。为了运行一个例子:

cbar=linspace(0,1,2);
for i=1:5
    for j=1:2
VAR{i}(j)=i+cbar(j);
    end
end

假设我想创建另一个 1x2 的单元格,并且每个单元格中有 5 个观察值 - 所以我正在重塑上面的 VAR 单元格。我接近这个的方式,这是行不通的,如下

for i=1:5
    for j=1:2
   VAR_new{j}(i)=VAR{i}(j);
    end
end

由于某种原因,VAR_new 是空的。

我怎样才能正确地做到这一点?谢谢!

【问题讨论】:

  • 为什么不直接使用 3D 数组(在这种情况下甚至可以使用 2D 数组)?效率更高,你可以用permute做你想做的操作(甚至只是换位)
  • 对于这个例子,确实可以。我可以试一试。但无论如何,我仍然想知道为什么我正在做的事情不起作用。有什么想法吗,@LuisMendo?
  • 你可以试试mat2cell(reshape([VAR{:}],5,[]),5,repelem(1,10)) 吗?
  • 您需要将for i=5 更改为for i=1:5,其他循环也一样:-)
  • “它不起作用”是什么意思?结果是一个单元格数组,1x10,每个单元格中有 5 个观察值

标签: matlab cell reshape


【解决方案1】:

您可以结合reshape 将矩阵重塑为所需的尺寸,并结合mat2cell 将矩阵转换为元胞数组:

VAR_new = mat2cell(reshape([VAR{:}],5,[]),5,repelem(1,2));

>> VAR_new

VAR_new =

  1×2 cell array

    {5×1 double}    {5×1 double}

>> VAR_new{1}

     1
     2
     2
     3
     3

>> VAR_new{2}

     4
     4
     5
     5
     6

【讨论】:

  • +1 以获得优雅的答案并教我有关repelem的知识
  • 很高兴帮助劳拉。 @b3 干杯。在这种情况下,repelem 是多余的,但是我将其保留为原始问题要求 1x10 单元阵列。
猜你喜欢
  • 1970-01-01
  • 2021-11-07
  • 1970-01-01
  • 2020-07-23
  • 2011-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多