如何检查矩阵是否在数组中(Matlab)

时间:2012-01-10 21:54:33

标签: matlab

我有一个矩阵数组(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

这使得该算法更频繁地工作,但我没有一个适合所有人的尺寸。我可以使用的阈值(这个过程可以继续任意多个步骤),所以它最终还是会破坏。

我该怎么做才能解决这个问题?

由于

1 个答案:

答案 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循环。我没有检查过,但我认为它应该有效。

这只是一个简单的调整,但同样,更多的想法可能会加速整个代码。