matlab错误,尝试引用非结构数组的字段

zor*_*arg 2 arrays matlab

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

好的,我有这个GINORMOUS阵列叫tier2comparatorconnectionpoints.它是尺寸为400×10×20×10的4-D阵列.考虑tier2comparatorconnectionpoints(counter,counter2,counter3,counter4).

  • counter是一个数字1400,
  • counter2是一个数字1numchromosomes(counter),并且numchromosomes(counter1)被绑定到10,
  • counter3是一个数字1tier2numcomparators(counter,counter2),而这又为界到20.
  • counter4是一个数字1tier2inputspercomparator(counter,counter2,counter3),其为界10.

现在,所以我没有RAM,我有tier2comparatorconnectionpoints类型int8,并且在我的可怕数量的代码中的某些时候不可靠,我忘了把它投入到double我正在用它做数学时,并且舍入错误涉及将其乘以rand最终tier2comparatorconnectionpoints,其4输入的某些值超出其允许的范围.

它不允许有值为1至tier1numcomparators(counter,counter2),其为界40,41通过40+tier2numcomparators(counter,counter2)tier2numcomparators(counter,counter2)定界到20,并61通过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)但小于40tier1numcomparators(counter,counter2),要设置任何大于40+tier2numcomparators(counter,counter2)高于但不6040+tier2numcomparators(counter,counter2),并设置任何大于60+tier2numcomparators(counter,counter2)60+tier2numcomparators(counter,counter2).我第一次发现这个问题是因为它被设置为81,所以它不仅仅超过60+tier2numcomparators(counter,counter2),它超过了60+20,tier2numcomparators受到限制20.

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

因此,在我尝试至少将数据转换为有效数据时,我执行了以下操作:

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
Run Code Online (Sandbox Code Playgroud)

这工作得很好.然后:

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
Run Code Online (Sandbox Code Playgroud)

这就是它所说的"尝试引用非结构阵列的字段".

Dan*_*Dan 5

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

无论哪种方式,你不需要所有那些for循环,它更简单,通常更快做到这一点(并应绕过你的错误):

首先复制你的tier2numcomparators矩阵,使其具有相同的尺寸大小为tier2comparatorconnectionpoints

T = repmat(tier2numcomparators + 40, 1, 1, size(tier2comparatorconnectionpoints, 3), size(tier2comparatorconnectionpoints, 4));
Run Code Online (Sandbox Code Playgroud)

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

ind = tier2comparatorconnectionpoints > T | tier2comparatorconnectionpoints < 60;
Run Code Online (Sandbox Code Playgroud)

最后使用逻辑索引来设置所需的元素:

tier2comparatorconnectionpoints(ind) = T(ind);
Run Code Online (Sandbox Code Playgroud)

你可以玩,bsxfun而不是repmat如果这个很慢或占用太多内存