2

我在网上搜索到的所有对这个错误的引用都完全不适用于我的情况,它们处理的是某种涉及点的变量,比如a.b(换句话说,结构),而我严格使用数组。没有任何东西涉及点,我的代码也没有询问它。

好的,我有一个名为tier2comparatorconnectionpoints. 它是一个大小为 400×10×20×10 的 4 维数组。考虑tier2comparatorconnectionpoints(counter,counter2,counter3,counter4)

  • counter是一个数1400
  • counter2是一个数字1numchromosomes(counter)并且numchromosomes(counter1)必然是10
  • counter3是一个数字1tier2numcomparators(counter,counter2)而它又是有界的20
  • counter4是一个数字1tier2inputspercomparator(counter,counter2,counter3)它有界到10

现在,为了避免内存不足,我有tier2comparatorconnectionpointsas type int8,不幸的是,在我可怕的代码量中的某个时刻,我double在用它做数学运算时忘记将它转换为 a ,并且出现舍入错误涉及将其与 a 相乘,rand最终导致tier2comparatorconnectionpoints其输入的某些值4超出了允许的值。

它允许的值是 1 到tier1numcomparators(counter,counter2), 有界到40, 41through 40+tier2numcomparators(counter,counter2), 有tier2numcomparators(counter,counter2)界到20, 和61through 60+tier2numcomparators(counter,counter2), 因此它不允许超过,80因为tier2numcomparators(counter,counter2)有界到20并且不允许超过60+tier2numcomparators(counter,counter2), 但它也不是允许小于40但大于tier1numcomparators(counter,counter2),不允许小于60但大于40+tier2numcomparators(counter,counter2)。我意识到了这个问题,因为它被设置在81某个地方。

顺便说一句,这是一个进化模拟,它是模拟生物的自然选择。我需要寻找代码中允许的值tier2comparatorconnectionpoints超过允许值的部分。但这是一个单独的问题。

对我的数据进行临时修复,以使其至少符合其允许的值,即设置大于tier1numcomparators(counter,counter2)但小于40to的任何内容,设置大于但小于totier1numcomparators(counter,counter2)的任何内容,并设置任何大于to 的东西。我第一次发现这个问题是因为它被设置为,所以它不只是超过,它超过了,被限制为。40+tier2numcomparators(counter,counter2)6040+tier2numcomparators(counter,counter2)60+tier2numcomparators(counter,counter2)60+tier2numcomparators(counter,counter2)8160+tier2numcomparators(counter,counter2)60+20tier2numcomparators20

我希望这不是太多的信息,但我觉得可能有必要让您了解这些变量的类型。

因此,在我尝试至少将数据转换为有效数据时,我做了以下事情:

for counter=1:size(tier2comparatorconnectionpoints,1)
 for counter2=1:size(tier2comparatorconnectionpoints,2)
  for counter3=1:size(tier2comparatorconnectionpoints,3)
   for counter4=1:size(tier2comparatorconnectionpoints,4)
    if tier2comparatorconnectionpoints(counter,counter2,counter3,counter4)>60+tier2numcomparators(counter,counter2)
     tier2comparatorconnectionpoints(counter,counter2,counter3,counter4)=60+tier2numcomparators(counter,counter2);
    end
   end
  end
 end
end

这工作得很好。接着:

for counter=1:size(tier2comparatorconnectionpoints,1)
 for counter2=1:size(tier2comparatorconnectionpoints,2)
  for counter3=1:size(tier2comparatorconnectionpoints,3)
   for counter4=1:size(tier2comparatorconnectionpoints,4)
    if tier2comparatorconnectionpoints(counter,counter2,counter3,counter4)>40+tier2numcomparators(counter,counter2)
     if tier2comparatorconnectionpoints(counter,counter2,counter3,counter4)<60
      tier2comparatorconnectionpoints(counter,counter2,counter3,counter4)=40+tier2numcomparators(counter,counter2);
     end
    end
   end
  end
 end
end

这就是它说“尝试引用非结构数组的字段”的地方。

4

1 回答 1

5

TBH 听起来你可能打错字并.在某个地方放了一个?否则,请发布整个错误,因为它可能发生在不同的功能或其他东西中。

无论哪种方式,您都不需要所有这些 for 循环,这样做更简单,通常更快(并且应该绕过您的错误):

首先复制您的tier2numcomparators矩阵,使其具有与tier2comparatorconnectionpoints

T = repmat(tier2numcomparators + 40, 1, 1, size(tier2comparatorconnectionpoints, 3), size(tier2comparatorconnectionpoints, 4));

现在,您可以一次性创建一个符合您条件的元素的逻辑矩阵:

ind = tier2comparatorconnectionpoints > T | tier2comparatorconnectionpoints < 60;

最后使用逻辑索引来设置你想要的元素:

tier2comparatorconnectionpoints(ind) = T(ind);

如果这很慢或占用太多内存bsxfun,您可以玩一下repmat

于 2013-09-19T14:51:04.727 回答