我可以在网上搜索的所有对这个错误的引用完全不适用于我的情况,他们正在处理某些涉及点的变量,比如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
如果这个很慢或占用太多内存