将矩阵转换为零矩阵;自定义转换规则

时间:2015-02-10 14:00:42

标签: python algorithm matlab math matrix

您将获得<{>>自然数的8x8表格。 (考虑一下魔术矩阵,让我们说)。在任何一个步骤中,您都可以 double each of the numbers in any row subtract 1 from each of the numbers in any one column 。设计 transforms the original table into a table of all zeros 的算法。

我尝试使用下面描述的算法,但它只需要很长时间。即使对于3×3矩阵,操作的数量也是10 ^ 49的量级。 任何人都可以使用这种算法,计算机对于8x8矩阵算法的时间复杂度是多少? 我在下面引用我的代码;有没有人有更好的效率算法,

dim = 3;
m=magic(dim)
for i=1:dim
    c=0;
    while(length(find(m(:,i)==2))~=length(m(:,i)))
        c = c + 1;
        if length(find(m(:,i)==1))>0
            for j=find(m(:,i)==1)
                m(j,:)=m(j,:)*2;

            end
        end
%         m
        if (i==2)
        m
        end

        if (length(find(m(:,i)==2))~=length(m(:,i)))
            k = min(m(find(m(:,i)>=2),i));
            l = length(find(m(:,i)==2));
            m(:,i)=m(:,i)-(k-1);
        end
%         m
        if (i==2)
       m
        end
%           if(i==3 && mod(c,100)==0)
%               c
%           end
    end
    i
    m(:,i)=m(:,i)-2
end
m

1 个答案:

答案 0 :(得分:1)

有一个解决方案如下,但我认为可以改进:

  1. 不要考虑其他专栏,每一步都只关注一列。

  2. 通过以下步骤将此列转换为零,并尝试将此列中的每个项目更改为2:

    • 考虑列中的最低非零非2项目为m
    • 减去此列m-1次。
    • 在上面的任何一项中的步骤变为1,其列为2。
    • 重复这三个步骤,直到您拥有全部2列。
  3. 现在从步骤2中减去两次,一次减去1.

  4. 对所有8列重复步骤1到3。

  5. 如果表的最大值为M,则此算法顺序为O(M)。因为表有64个项目。

    我希望我的算法很清楚,但是如果有任何你不理解的事情,请问。

    编辑,为了更好地理解这一点,我只需针对您找到here的简单矩阵执行此步骤。