我可以在网上搜索的所有对这个错误的引用完全不适用于我的情况,他们正在处理某些涉及点的变量,比如a.b(结构换句话说),而我严格使用数组.什么都不涉及点,我的代码也没有询问它.
好的,我有这个GINORMOUS阵列叫tier2comparatorconnectionpoints.它是尺寸为400×10×20×10的4-D阵列.考虑tier2comparatorconnectionpoints(counter,counter2,counter3,counter4).
counter是一个数字1到400,counter2是一个数字1到numchromosomes(counter),并且numchromosomes(counter1)被绑定到10,counter3是一个数字1到tier2numcomparators(counter,counter2),而这又为界到20.counter4是一个数字1到tier2inputspercomparator(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)但小于40到tier1numcomparators(counter,counter2),要设置任何大于40+tier2numcomparators(counter,counter2)高于但不60至40+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)
这就是它所说的"尝试引用非结构阵列的字段".
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如果这个很慢或占用太多内存