【问题标题】:size of inner elements of cells细胞内部元素的大小
【发布时间】:2015-05-19 10:57:36
【问题描述】:

我正在读取一些带有属性的数据(比如 A,其中第一行是 ids,第二行是它们的属性值)。我想将这些数据放在一个单元格中,其中第一列是唯一 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 的位置并插入那里? 感谢您的帮助。

【问题讨论】:

  • 使用 find(C{1}(j,:) == 0,1) 确实应该适用于第 j 行,但请注意,如果整行都被填满,find 将返回一个空的索引数组。 But why not use matlabs map container filled with lists?
  • 所以,首先我要检查它是否包含 0 使用 ismember 或 find 来查找非零元素的第一个索引,如果它返回空我使用 end+1 插入新的项目。我必须在我的代码中多次使用它。带有列表的地图容器的主要好处是什么?细胞不做同样的事情?
  • @hamideh 您不必每次都这样做。你可以一次完成。我已经发布了答案。看看:)
  • @Santhan,非常感谢,它确实有效,请您告诉我那些 . 点在您的脚本中的含义是什么?而且我的情况实际上有 3 行,我想将这些值放置到结果单元格中。例如A=[ 1 2 3 2;2 4 5 9;1 2 7 4] 我希望 C 采用单元格格式,输出 [1]->[2 1], [2]->[4 2; 9 5], [3]->[5 7] 那么,您的脚本可以更改吗在标识符行下添加列的一般情况? (重复标识符的属性彼此跟随或各自放在一行中)
  • 如果你问.',它只是意味着转置。在使用' 时会进行共轭转置。当然,将它们用于实数会产生相同的结果。我不明白你的第二个问题

标签: matlab size cell-array


【解决方案1】:

为什么不使用单元阵列来解决这类问题?您是如何生成 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

注意:如果 subs 中的下标没有按照它们的线性索引排序,那么 accumarray 在将 val 中的数据传递给 @ 时可能不会始终保持它们的顺序987654340@。在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]

希望这会有所帮助!

【讨论】:

  • 进一步,对于二维元胞数组的一般情况。例如a 最后是一个 3*3 单元格 a = [2x1 double] [2x1 double] [2x1 double] ; [ 1] [2x1 double] [] ; [ 1] [] [] 现在对于第一列中的行数,我们可以使用 size(a,1) 但是我们如何确定第二列中非空单元格的数量示例(即 2)?
  • @hamideh sum(~cellfun(@isempty, A)) 这将给出每列的非空单元格的数量
  • @hamideh 很高兴它成功了 :) 如果您的问题得到解决,请考虑接受答案 :)
  • 如您所见,由于我不知道最终单元格数组的大小,并且行和列是增量添加的,因此我遇到了空单元格。如果我想避免这些空单元格,您提到使用嵌套单元格。这是一种常见的做法吗?不是更复杂吗?从记忆的角度来看更好吗?非常感谢您给予我宝贵的经验..
  • @hamideh 使用嵌套单元格数组非常好.. 创建空单元格并删除它们的成本很高.. 应尽可能避免使用它们
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多