【问题标题】:Solve wrong type argument 'cell'解决错误类型参数 'cell'
【发布时间】:2015-03-16 13:33:26
【问题描述】:

我使用变量'O' 写入一些值

for i = 1:size(I,1)
for j = 1:size(1,I)
h = i * j;
O{h} = I(i, j) * theta(h);
end
end

I - 双倍,theta - 双倍。 我需要sum()all 'O' 值,但是当我这样做时,它会给我error: sum: wrong type argument 'cell'。 我怎样才能sum()呢? 附:当我想看O()时,它给我

O = 
{
  [1,1] =  0.0079764
  [1,2] =  0.0035291
  [1,3] =  0.0027539
  [1,4] =  0.0034392
  [1,5] =  0.017066
  [1,6] =  0.0082958
  [1,7] =    1.4764e-04
  [1,8] =  0.0024597
  [1,9] =    1.1155e-04
  [1,10] =  0.0010342
  [1,11] =  0.0039654
  [1,12] =  0.0047713
  [1,13] =  0.0054305
  [1,14] =    3.3794e-04
  [1,15] =  0.014323
  [1,16] =  0.0026826
  [1,17] =  0.013864
  [1,18] =  0.0097778
  [1,19] =  0.0058029
  [1,20] =  0.0020726
  [1,21] =  0.0016430 
etc...

【问题讨论】:

    标签: matrix sum cell octave


    【解决方案1】:

    您问题的确切答案是使用cell2mat

    sum (cell2mat (your_cell_o))
    

    但是,这是解决您的问题的非常错误的方法。问题是您不应该首先创建单元阵列。你应该已经创建了一个数值数组:

    O = zeros (size (I), class (I));
    for i = 1:rows (I)
      for j = 1:columns (I)
        h = i * j;
        O(h) = I(i, j) * theta(h);
      endfor
    endfor
    

    但即使这样也很糟糕而且很慢。 Octave 是一种向量化操作的语言。相反,您应该:

    h = (1:rows (I))' .* (1:columns (I)); # automatic broadcasting
    O = I .* theta (h);
    

    假设您的函数 theta 行为正常,并且如果给定一个矩阵将计算 h 的每个元素的值并返回相同大小的值。

    如果您收到有关尺寸错误的错误,我猜您使用的是旧版本的 Octave,它不执行自动广播。如果是这样,请更新 Octave。如果你真的不能,那么:

    h = bsxfun (@times, (1:rows (I))', 1:columns (I));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-25
      • 2017-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多