阅读下列说明和C代码,回答以下问题,将解答写在答题纸的对应栏内。 【说明】 某工程计算中要完成多个矩阵相乘(链乘)的计算任务。 两个矩阵相乘要求第一个矩阵的列数等于第二个矩阵的行数,计算量主要由进行乘法运算的次数决定。采用标准的矩阵相乘算法

admin2014-05-07  37

问题 阅读下列说明和C代码,回答以下问题,将解答写在答题纸的对应栏内。
【说明】
    某工程计算中要完成多个矩阵相乘(链乘)的计算任务。
    两个矩阵相乘要求第一个矩阵的列数等于第二个矩阵的行数,计算量主要由进行乘法运算的次数决定。采用标准的矩阵相乘算法,计算Am×n*Bn×p,需要m*n*p次乘法运算。
    矩阵相乘满足结合律,多个矩阵相乘,不同的计算顺序会产生不同的计算量。以矩阵A110×100,A2100×5,A35×50三个矩阵相乘为例,若按(A1*A2)*A3计算,则需要进行10*100*5+10*5*50=7500次乘法运算;若按A1*(A2*.A3)计算,则需要进行100*5*50+10*100*50=75000次乘法运算。可见不同的计算顺序对计算量有很大的影响。
    矩阵链乘问题可描述为:给定n个矩阵,矩阵Ai的维数为pi-1×pi,其中i=1,2,…,n。确定一种乘法顺序,使得这n个矩阵相乘时进行乘法的运算次数最少。
    由于可能的计算顺序数量非常庞大,对较大的n,用蛮力法确定计算顺序是不实际的。经过对问题进行分析,发现矩阵链乘问题具有最优子结构,即若A1*A2*…*An的一个最优计算顺序从第k个矩阵处断开,即分为A1*A2*…*Ak和Ak+1*Ak+2*…*An两个子问题,则该最优解应该包含A1*A2*…*Ak的一个最优计算顺序和Ak+1*Ak+2*…*An的一个最优计算顺序。据此构造递归式,
  
  其中,cost[j]表示Ai+1*Ai+2*…*Aj+1的最优计算的计算代价。最终需要求解cost[0][n-1]。
【C代码】
    算法实现采用自底向上的计算过程。首先计算两个矩阵相乘的计算量,然后依次计算3个矩阵、4个矩阵……n个矩阵相乘的最小计算量及最优计算顺序。下面是该算法的C语言实现。
  (1)主要变量说明
    n:矩阵数
  seq[]:矩阵维数序列
  cost[][]:二维数组,长度为n*n,其中元素costD]表示Ai+1*Ai+2*…*Aj+1的最优计算的计算代价
    trace[][]:二维数组,长度为n*n,其中元素tmceU]表示Ai+1*Ai+2*…*Aj+1的最优计算对应的划分位置,即k
    (2)函数cmnl
    #define    N 100
    int cost[N][N];
    int trace[N][N];
    int cmm(int n,int seq[]){
    int tempCost;
    int tempTrace;
    int i , j , k, p;
    int temp;
    for(i=0;i=0;    )
    for(p=1;P    for(i=0;    (1)  ;i++){
    (2)    ;
    tempCost=-1;
    for(k=i;  k    temp=  (3)  ;
    if(tempCost==-1 I I tempCost>temp){
    tempCost=temp;
    (4);
    }
    }
    cost[J]=tempCost;
    trace[J]=tempTrace;
    }
    }
    return cost[0][n-1];
    }
考虑实例n=6,各个矩阵的维数:A1为5*10,A2为10*3,A3为3*12,A4为12*5, A5为5*50,A6为50*6,即维数序列为5,10,3,12,5,50,6。则根据上述C代码得到的一个最优计算顺序为(7)(用加括号方式表示计算顺序),所需要的乘法运算次数为(8)。

选项

答案(7)((A1 A2)((A3 A4)(A5 A6))) (8)2010

解析 本问题考查算法的应用。通过一个具体实例可以更容易理解问题和求解方法。可以根据问题1中的程序执行来求解。启发式的思路是先把维度最大的消掉,如A5*A6相乘之后,维度50就没有了,所以考虑这两个矩阵先相乘;然后是A3*A4相乘之后,维度12就没有了,所以考虑这两个矩阵相乘;接着,A1*A2相乘之后,维度10就没有了,所以考虑这两个矩阵相乘……这样可以确定相乘的顺序((A1A2)((A3A4)(A5A6))),需要的计算开销分别是5*50*6=1500,3*12*5=180,5*10*3=150,3*5*6=90,5*3*6=90,把上述值相加,即1500+180+150+90+90=2010。
转载请注明原文地址:https://kaotiyun.com/show/giDZ777K
0

相关试题推荐
最新回复(0)