我有一个矩阵数组(M)。我在第i个位置对矩阵执行操作,并在(3i-1),(3i)和(3i + 1)个位置向我的数组添加三个矩阵。我想继续这个过程,直到我到达数组中的第j个位置,其中j是第(j + 1)个位置和之后的所有矩阵已经出现在位置1和j(包括)之间的某个位置。
编辑:我被要求澄清我的意思。我无法编写使我的算法终止的代码,如上所述。如果我知道搜索矩阵数组的正确方法来检查是否包含给定矩阵,那么我就可以做到。我尝试了以下方法:done = 0;
ii = 1
while done ~= 1
%operation on matrix in ith position omitted, but this is where it goes
for jj = ii+1:numel(M)
for kk = 1:ii
if M{jj} == M{kk};
done = done + 1/(numel(M) - ii);
break
end
end
end
if done ~= 1
done = 0;
end
ii = ii + 1
end
我遇到的问题(因为我确定你可以看到)是如果进程持续太长时间,舍入错误就会停止,允许done = 1,并且算法不会终止。我尝试通过引入阈值来解决这个问题,例如
while abs(done - 1) > thresh
和
if abs(done - 1) > thresh
done = 0;
end
这使得该算法更频繁地工作,但我没有一个适合所有人的尺寸。我可以使用的阈值(这个过程可以继续任意多个步骤),所以它最终还是会破坏。
我该怎么做才能解决这个问题?
由于
答案 0 :(得分:0)
为什么不在0处初始化完成,保持你的完成== 0循环,而不是作为元素之和完成计算,检查你的条件(发现矩阵是否已存在)是否为所有jj验证,像这样:
alldone=zeros(numel(M)-ii,1);
for jj = ii+1:numel(M)
for kk = 1:ii
if isequal(M{jj},M{kk})
alldone(jj-ii) = 1
break
end
end
end
done=prod(alldone);
但是,可能有更优雅的方式对此进行编码。 例如,您可以添加提前终止:
while done==0
done=1;
for jj = ii+1:numel(M)
match_success=0;
for kk = 1:ii
if isequal(M{jj},M{kk})
match_success=1;
break
end
end
if match_success==0
done=0;
break;
end
end
end
在每个循环开始时,算法假定它将成功并停在那里(因此done = 1)。然后对于每个jj,我们创建一个match_success,只有在找到M {jj}的匹配时才会将其设置为1。如果找到匹配,我们休息并转到下一个j。如果为j找不到匹配,则match_success保留为0,则将done初始化为0并继续while循环。我没有检查过,但我认为它应该有效。
这只是一个简单的调整,但同样,更多的想法可能会加速整个代码。