Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将矩阵变换为零矩阵;自定义转换规则_Python_Algorithm_Matlab_Math_Matrix - Fatal编程技术网

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

Python 将矩阵变换为零矩阵;自定义转换规则,python,algorithm,matlab,math,matrix,Python,Algorithm,Matlab,Math,Matrix,您将获得一个8x8自然数表。(比如说,考虑魔法矩阵)。在任何一个步骤中,您可以将任何一行中的每个数字加倍,或者从任何一列中的每个数字中减去1。设计 将原始表转换为全零表的算法 我试着使用下面描述的算法,但这需要很长时间。即使对于3x3矩阵,运算次数也为10^49。 任何使用此算法的人,计算机,8x8矩阵算法的时间复杂度是多少? 我在下面引用我的代码;有没有人有更高效的算法 dim = 3; m=magic(dim) for i=1:dim c=0; while(length(fi

您将获得一个
8x8
自然数表。(比如说,考虑魔法矩阵)。在任何一个步骤中,您可以
将任何一行中的每个数字加倍
,或者
从任何一列中的每个数字中减去1。设计
将原始表转换为全零表的算法

我试着使用下面描述的算法,但这需要很长时间。即使对于3x3矩阵,运算次数也为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

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

不要考虑其他栏目,每一步都只关注一个栏目。

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

    • 考虑列中最低的非零非2项为
      m
    • 将此列减去
      m-1
    • 在上面的步骤中,行的任何项都变成了列的1倍和2倍
    • 重复这三个步骤,直到完成所有2列
  • 现在用1减去步骤2中的列,两次

  • 对所有8列重复步骤1至3

  • 如果表的最大值为M,则此算法顺序为O(M)。因为表中有恒定的64项

    我希望我的算法是清楚的,但如果有什么你不明白的,请问


    编辑:为了更好地理解这一点,我只对您找到的一个简单矩阵执行以下步骤。

    您尝试的暴力方式是什么?可能是您没有得到它,因为此问题对于任何输入都无法解决,例如
    M=one(8,8);M(1)=2。也许可以开始编写一个问题生成器,生成可解决的实例。从一个零矩阵开始,并暗示反向步骤,然后你得到一个可解矩阵,你就知道了答案。@Daniel你的例子是错误的,Prateek提到的自然数是从1开始的。这个问题总是有答案的,只要看看我下面的算法:)记住这些算法很可能会出现整数溢出。@Daniel:
    M=one(8,8);M(1)=2将是可解的:将除第一行以外的所有行乘以2,从第1列进行两次减法运算,将第一行乘以2,从除第1列以外的所有行进行两次减法运算。您的意思是,在第2步(iii)中,“在上述步骤中,列的任何项变为1,将其行乘以2”?我不清楚第2步(iii)和(iv)@Prateek查看此链接,这将解决您的问题:)@Prateek您看到我的编辑了吗?你还有什么问题吗?是的,我看到了编辑。我检查了它的工作原理,但它只是变得非常大!我的电脑,甚至不能完成它,即使是一个3x3魔术矩阵。将前两列自身归零时,数字的顺序为10^48。就在那时,一切还没有结束。你能告诉我你所说的算法的顺序是O(M)是什么意思吗?@Prateek真的吗?那么大?我原以为会很大,但没那么大!你是不是有多余的?或者时间复杂性是你的问题?