细胞内部元素的大小

时间:2015-05-19 10:57:36

标签: matlab size cell-array

我正在阅读一些带有属性的数据(比如A,其中第一行是ID,第二行是它们的属性值)。我想将这些数据放在第一列是唯一ID的单元格中,第二列是其属性。每当有属性的重复值时,我就会在其前面的空位上放置空位。例如,我想构建C

A =
 1     2     3     2
 2     4     5     9

C{1}=
1   2   0
2   4   9
3   5   0

当我要测试单元格内部房屋的大小时,例如

size(C{1},2)

ans = 3

size(C{1},1)

ans = 3

size(C{1}(1,:),2)

ans =  3

所有返回3,因为它占用0的空房。那么我应该如何理解我的新数据的位置(例如(1,5))?我应该遍历或找到0的位置并插入那里吗? 谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

为什么不使用cell-Array来解决这类问题呢?你是如何生成C矩阵的?

即使您已使用C矩阵的单元格数组,C的每个元素都是一个矩阵,因此维度应保持不变。

我在矩阵中使用了一个单元格数组。 (即)每个元素根据重复的大小采用自己的大小。例如,您可以看到C{2,2}具有两个值,而C{1,2}C{3,2}只有一个值。您可以轻松检查它们的大小而不检查零。请注意,即使任何值为零,此代码仍然有效。

矩阵的第一列代表identifiers,而第二列代表values,它根据重复数量采用自己的大小。

以下是使用accumarrayunique生成C作为单元格数组的实现。

<强>代码:

C = [num2cell(unique(A(1,:).')),  accumarray(A(1,:).',A(2,:).',[],@(x) {x.'})]

您的样本输入:

A = [1     2     3     2;
     2     4     5     9];

<强>输出:

>> C

C = 

[1]    [         2]
[2]    [1x2 double]
[3]    [         5]

>> size(C{2,2},2)

ans =

 2

>> size(C{1,2},2)

ans =

 1

来自 DOC

  

注意:如果sub中的下标未按其线性索引排序,则accumarray可能无法始终保留val中数据的顺序将它们传递给fun。在fun要求其输入值与它们在val中出现的顺序相同的特殊情况下,根据输出的线性索引对subs中的索引进行排序。

另一个例子:
输入

A = [1  2   1   2   3   1;
     2  4   5   9   4   8];

<强>输出:

C = 

[1]    [1x3 double]
[2]    [1x2 double]
[3]    [         4]

希望这会有所帮助!!