我正在阅读一些带有属性的数据(比如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的位置并插入那里吗? 谢谢你的帮助。
答案 0 :(得分:1)
为什么不使用cell-Array来解决这类问题呢?你是如何生成C
矩阵的?
即使您已使用C
矩阵的单元格数组,C
的每个元素都是一个矩阵,因此维度应保持不变。
我在矩阵中使用了一个单元格数组。 (即)每个元素根据重复的大小采用自己的大小。例如,您可以看到C{2,2}
具有两个值,而C{1,2}
和C{3,2}
只有一个值。您可以轻松检查它们的大小而不检查零。请注意,即使任何值为零,此代码仍然有效。
矩阵的第一列代表identifiers
,而第二列代表values
,它根据重复数量采用自己的大小。
以下是使用accumarray
和unique
生成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]
希望这会有所帮助!!