【问题标题】:How to rearrange cell contents into a single matrix in Matlab如何在 Matlab 中将单元格内容重新排列为单个矩阵
【发布时间】:2017-01-09 11:47:05
【问题描述】:

假设我有一个名为data 的单元格,其中包含三个元素。每个单元格元素都包含一个 (n x 2) 矩阵。 data中每个单元格的第一列是它旁边数据的ID,而第二列是实际数据。请注意,我正在使用的实际 data 不包含 rand 数字,而是实际的特定数字。

data = cell(1,3);

data{1} = [1 rand ;
           2 rand ;
           3 rand ;
           4 rand];

data{2} = [2 rand ;
           3 rand ;
           4 rand ;
           5 rand ;
           6 rand];

data{3} = [2 rand ;
           5 rand ;
           6 rand ;
           7 rand ;
           8 rand ;
           9 rand];

我想将data 的内容重新排列成一个名为rearrange 的矩阵,如下所示。可以看到,ID1只存在于data{1},所以randrearrange的第一行的第三列和第四列被认为是0。可以看到,ID9只存在于data{3},所以randrearrange的第9行第2列和第3列被认为是0。

rearrange = [1 rand 0    0    ; 
             2 rand rand rand ;
             3 rand rand 0    ;
             4 rand rand 0    ;
             5 rand rand rand ;
             6 0    rand rand ;
             7 0    0    0    ;
             8 0    0    rand ;
             9 0    0    rand];

在这种情况下,唯一 ID 是 1:9,但我想自动生成唯一 ID 列表,而不仅仅是说 1:9

【问题讨论】:

  • Join Matrices in MATLAB的可能重复
  • 旁注,rearrange 是一个内置的 matlab 函数,所以尽可能不要用作变量名
  • @Trogdor 我想我可能使用的是旧版本,rearrange 似乎不存在(2015a)。不过下次我会小心的。
  • @Senyokbalgul,你说得对,重新排列不是函数,我很困惑

标签: matlab matrix indexing cell-array


【解决方案1】:

这可以很容易地使用for 循环来完成:

CellData = data; 
for n = 1:length(CellData) %loop through each cell
    indices = CellData{n}(:,1); %extract indices
    values = CellData{n}(:,2); % extract values
    Matrix(indices, n) = values; %assign values to correct location
end
% add the first column in
sMatrix = size(Matrix);
counter = 1:sMatrix(1);
finalMatrix = [counter' Matrix];

【讨论】:

  • 感谢您的简单解决方案
【解决方案2】:

你可以使用 for 循环:

for i = 1: length(data)
    rearrange(data{i}(:,1),i+1) = data{i}(:,2);
end
rearrange(:,1) = 1:size(rearrange,1);

【讨论】:

  • 很好的解决方案,虽然我建议您预先分配最终数组
  • @rahnema1 感谢您的帮助。
  • @Trogdor 好的,但这需要多一步来计算最大 ID,因此答案可能看起来更复杂。您可以在答案中添加预分配
  • @rahnema1,哈哈,你说得对,我的回答也错过了预分配,你说得对,这并不像我想的那么琐碎