荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: huhaiming (一生只爱她), 信区: Program
标  题: [合集]请教strassen矩阵乘法问题
发信站: 荔园晨风BBS站 (2004年10月30日09:42:06 星期六), 站内信件

☆   1  ──────────── 我是分割线 ─────────────────☆
发信人: acmer (飘飘), 信区: Program
标  题: 请教strassen矩阵乘法问题
时  间: 2004年10月10日16:39:21 星期天

算法我已经比较明白了,但是要实现感觉有点困难。哪位可以提示
一下代码的框架?或者共享一下代码怎么样?谢谢了


☆   2  ──────────── 我是分割线 ─────────────────☆
发信人: bakey (深海的鱼爱上会潜水的猫), 信区: Program
标  题: Re: 请教strassen矩阵乘法问题
时  间: 2004年10月10日21:19:19 星期天

555。。。谁帮我看一下~~



☆   3  ──────────── 我是分割线 ─────────────────☆
发信人: Kenniel (here goes), 信区: Program
标  题: Re: 请教strassen矩阵乘法问题
时  间: 2004年10月10日22:06:28 星期天

框架:

void Strassen( n , A , B , C )
{
    if( n==2 )
        Adhoc_Matrix_Mul( A, B, C, n );//递归分解矩阵
    Else
    {
        Strassen( n/2 , A11 , B12-B22, M1 );
        Strassen( n/2 , A11+A12 ,B22, M2 );
        Strassen( n/2 , A21+A22 , B11 , M3 );
        Srtassen( n/2 , A22, B21-B11 ,M4 );
        Strassen( n/2 , A11+A22 , B11+B22 , M5 );
        Strassen( n/2 , A12-A22 , B21+B22 , M6 );
        Strassen( n/2 , A11-A21 , B11+B12 , M7 );
        C1=M5+M4-M2+M6;
        C2=M1+M2;
        C3=M3+M4;
        C4=M5+M1-M3-M7;
        Merge( C1,C2,C3,C4,C,n );//最后合并回一个矩阵
    }
}



☆   4  ──────────── 我是分割线 ─────────────────☆
发信人: bakey (深海的鱼爱上会潜水的猫), 信区: Program
标  题: Re: 请教strassen矩阵乘法问题
时  间: 2004年10月10日22:37:50 星期天

这个框架我知道了,但是那个M1,M2....是怎么实现?



☆   5  ──────────── 我是分割线 ─────────────────☆
发信人: kaman (天外飞仙), 信区: Program
标  题: Re: 请教strassen矩阵乘法问题
时  间: 2004年10月11日10:28:14 星期一


er……只是算一个二阶矩阵而已~~~你喜欢怎样算就怎样算啦~




☆   6  ──────────── 我是分割线 ─────────────────☆
发信人: bakey (深海的鱼爱上会潜水的猫), 信区: Program
标  题: Re: 请教strassen矩阵乘法问题
时  间: 2004年10月11日12:23:57 星期一

Mx一定是二阶的?



☆   7  ──────────── 我是分割线 ─────────────────☆
发信人: kaman (天外飞仙), 信区: Program
标  题: Re: 请教strassen矩阵乘法问题
时  间: 2004年10月11日14:22:00 星期一


都是递归分成二阶的啦,不过不是随便算,刚才记错了,这里的算二阶的是直接影响

到算法的时间复杂度的,一下是一种把二阶乘法化成7次算法和四次合并的办法

 Adhoc_Matrix_Mul函数主要算Mx

        M1=A11(B12-B22)

        M2=(A11+A12)B22

        M3=(A21+A22)B11

        M4=A22(B21-B11)

        M5=(A11+A22)(B11+B22)

        M6=(A12-A22)(B21+B22)

        M7=(A11-A21)(B11+B12)

merge:



        C11=M5+M4-M2+M6

        C12=M1+M2

        C21=M3+M4

        C22=M5+M1-M3-M7

验证一下:


    C22=M5+M1-M3-M7

       =(A11+A22)(B11+B22)+A11(B12-B22)-(A21+A22)B11-(A11-A21)(B11+B12)

       =A11B11+A11B22+A22B11+A22B22+A11B12

         -A11B22-A21B11-A22B11-A11B11-A11B12+A21B11+A21B12

       =A21B12+A22B22




☆   8  ──────────── 我是分割线 ─────────────────☆
发信人: bakey (深海的鱼爱上会潜水的猫), 信区: Program
标  题: Re: 请教strassen矩阵乘法问题
时  间: 2004年10月11日15:41:57 星期一

这个我知道,就是strassen嘛。不过不会实现:-(



☆   9  ──────────── 我是分割线 ─────────────────☆
发信人: kaman (天外飞仙), 信区: Program
标  题: Re: 请教strassen矩阵乘法问题
时  间: 2004年10月11日16:16:35 星期一


无言……




☆  10  ──────────── 我是分割线 ─────────────────☆
发信人: jango (姜戈,理想高于一切), 信区: Program
标  题: Re: 请教strassen矩阵乘法问题
时  间: Sun Oct 17 16:53:50 2004

#include<stdio.h>
#include<string.h>

struct maze
{
        int n;
};

struct maze add(struct maze r1,struct maze r2)
{
        struct maze rt;
}

struct maze sub(struct maze r1,struct maze r2)
{
        struct maze rt;
}
struct maze mul(struct maze r1,struct maze r2);

struct maze strassen(struct maze r1,struct maze r2)
{
        struct maze rt;
}
struct maze mul(struct maze r1,struct maze r2)
{
        struct maze rt;
}

void print(struct maze r1)
{
        int i,j;
}
void main()
{
        int n,i,j;
}


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店