java程序改为c++版本

来源:互联网  时间:2016/9/2 4:31:34

关于网友提出的“ java程序改为c++版本”问题疑问,本网通过在网上对“ java程序改为c++版本”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: java程序改为c++版本
描述:

c++多线程javathread

 我现在有一个java多线程的程序,是矩阵相乘的,本人技术不行,望各位大神能帮忙将其改为c++的,小弟不胜感激。
class newthread implements Runnable {// 线程类的声明,用于计算矩阵相乘
Thread t; // 把矩阵划分为2*2的子矩阵形式
int minor;
int large;
int total;
int a[][] = new int[800][800];// 保存划分子矩阵后的矩阵第1/2行
int b[][] = new int[800][800];// 保存划分子矩阵后的矩阵第1/2列
int d[][] = new int[800][800];// d与e保存子矩阵一行 与一列相乘的结果(产生两个子矩阵)
int e[][] = new int[800][800];//
int count1, count2;// 二维坐标,标识两个矩阵相乘时的行标和列表
newthread(int aa[][], int bb[][], int ccount1, int ccount2, int minor,
int large,String s) {
t = new Thread(this, s);
count1 = ccount1;
count2 = ccount2;
this.minor = minor;
this.large = large;
total = minor + large;
for (int i = 0; i < minor + count1 * (large - minor); i++) {
for (int j = 0; j < total; j++) {
a[i][j] = aa[i + count1 * minor][j];// 依据行标从大矩阵中取一行
}
}
for (int i = 0; i < minor + count2 * (large - minor); i++) {
for (int j = 0; j < total; j++) {
b[j][i] = bb[j][i + count2 * minor];// 依据列标从大矩阵中取一列
}
}
}
    public void start(){
     t.start();
    }
public void run() {
for (int i = 0; i < minor + count1 * (large - minor); i++) {
for (int j = 0; j < minor + count2 * (large - minor); j++) {
d[i][j] = 0;
for (int k = 0; k < minor; k++) {
d[i][j] = d[i][j] + b[k][j] * a[i][k];// 包含两个元素的两个向量相乘
}
}
}
for (int i = 0; i < minor + count1 * (large - minor); i++) {
for (int j = 0; j < minor + count2 * (large - minor); j++) {
e[i][j] = 0;
for (int k = 0; k < large; k++) {
e[i][j] = e[i][j] + b[k + minor][j] * a[i][k + minor];// 包含两个元素的两个向量相乘
}
}
}
for (int i = 0; i < minor + count1 * (large - minor); i++) {
for (int j = 0; j < minor + count2 * (large - minor); j++) {
e[i][j] = e[i][j] + d[i][j];// 将相乘结果相加。
}
}
}
public int[][] getresu() {// 将结果返回
return e;
}
public static void main(String[] args) 
{
int minor=400;
int large=400;
int total;
long start,start1,start2;
long end,end1,end2;
long a1,a2,all1,all2;
int a[][] = new int[800][800];
int b[][] = new int[800][800];
int c[][] = new int[800][800];
total = minor + large;
  for (int i = 0; i < minor + large; i++) {
for (int j = 0; j < minor + large; j++) {
a[i][j] = 1;
b[i][j] = 1;
c[i][j] = 0;
}
}// 对矩阵初始化
int resultchild[][][] = new int[4][800][800];// 并行运算结果
start = System.currentTimeMillis();// 并行计算开始
newthread o = new newthread(a, b, 0, 0, minor, large,"o");// 计算矩阵1第一行与矩阵2第一列相乘
newthread p = new newthread(a, b, 0, 1, minor, large,"p");// 计算矩阵1第一行与矩阵2第二列相乘
newthread q = new newthread(a, b, 1, 0, minor, large,"q");// 计算矩阵1第二行与矩阵2第一列相乘
newthread r = new newthread(a, b, 1, 1, minor, large,"r");// 计算矩阵1第二行与矩阵2第二列相乘
o.t.setPriority(5);
p.t.setPriority(5);
q.t.setPriority(5);
r.t.setPriority(5);
r.start();
q.start();
p.start();
o.start();
       
try {
o.t.join();// 等待所有线程结束
p.t.join();
q.t.join();
r.t.join();
} catch (InterruptedException e) {
System.out.println("interrupted");
}
resultchild[0] = o.getresu();// 将计算的结果保存到三维数组
resultchild[1] = p.getresu();
resultchild[2] = q.getresu();
resultchild[3] = r.getresu();
end = System.currentTimeMillis();// 并行计算结束
        all2=end-start;
        int row=400;
    int col=400;
int i, j, k;// 计算结果的相对坐标
i = 2 * (row < minor ? 0 : 1) + (col < minor ? 0 : 1);
j = row - (row < minor ? 0 : minor);
k = col - (col < minor ? 0 : minor);
System.out.println("并行计算结果是:" + resultchild[i][j][k]);
System.out.println("并行计算时间是:" + all2);
  }
}

解决方案1:

引用 8 楼 handsome9501 的回复:
引用 5 楼 rexlv 的回复:可以考虑下boost.thread,如果不用c11 thread库的话。可以帮忙吗?

想试试来着,可以最近有点小忙,明后天要是不用熬夜的话,就用boost.thread实现一下试试。 赞一下强大的豆腐哥,话说我还真没看明白楼主的矩阵运算...(楼主,几百行的代码,行行好,排排版吧,~@~)。so,手上正好有个以前封装的矩阵运算,贴一下。

#include 
#include 
#include 
using namespace std;
template
class Matrix{
    typedef T value_type;
    typedef value_type* pointer;
    typedef pointer iterator;
public:
    template
    Matrix(InputIterator __first, InputIterator __last)
        : nWidth(W), nDepth(D), nLength(W * D){
        int cnt = 0;
        __last = min(__first + nLength, __last);
        InputIterator tmp = __first;
        for(; tmp != __last; tmp++, cnt++){
            matrix[cnt] = *tmp;
        }
        while(cnt < nLength){
            matrix[cnt] = 0;
            cnt++;
        }
    }
    Matrix(): nWidth(W), nDepth(D), nLength(W * D){}
    Matrix transpose(){
        int cnt = 0;
        int dep = 0;
        int wid = 0;
        Matrix m;
        iterator tmp = head();
        for(; tmp != tail(); tmp++, cnt++){
            wid = cnt / nWidth;
            dep = cnt % nWidth;
            m.matrix[dep * nDepth + wid] = *tmp;
        }
        while(++cnt < nLength){
            wid = cnt / nWidth;
            dep = cnt % nDepth;
            m.matrix[dep * nDepth + wid] = 0;
        }
        return m;
    }
    iterator head(){
        return matrix;
    }
    iterator tail(){
        return matrix + nLength;
    }
    void set(int pos, T value){
        if(pos >= nLength)
            return;
        matrix[pos] = value;
    }
public:
    void print(){
        for(int h = 0; h < nDepth; h++){
            for(int w = 0; w < nWidth; w++)
                cout<< matrix[h * nWidth + w] << ' ';
            cout << endl;
        }
    }
    template
    Matrix operator *(Matrix& m){
        Matrix tmp;
        Matrix m_trans = m.transpose();
       for(int i=0; inDepth; i++){
           iterator first1 = this->head() + i * nWidth;
           iterator last1 = first1 + nWidth;
           for(int j=0; j<>
               iterator first2 = m_trans.head() + j * nWidth;
               tmp.set(i* (m.nWidth) + j, std::inner_product(first1,last1,first2,0) );
           }
       }
       return tmp;
    }
public:
    T matrix[D * W];
    int nWidth;
    int nDepth;
    int nLength;
};
int main()
{
    int ia[50] = {1,2,3,4,5,6,12,1,2,3,4,5,6,12,1,2,3,4,5,6,12,1,2,3,4,5,6,12,1,2,3,4,5,6,12};
    Matrix matrix1(ia, ia+30);
    matrix1.print();
    Matrix matrix2(ia, ia+24);
    matrix2.print();
    Matrix matrix3 = (matrix1 * matrix2).transpose();
    matrix3.print();
}
解决方案2:

很不幸,C++中暂时还没有Java那样的标准线程库,也许,你应该先告诉大家,你用的是啥平台~ java程序改为c++版本

上一篇C++对象模型
下一篇MFC 加载 gif 图片如何透明掉gif背景色
明星图片
相关文章
《 java程序改为c++版本》由码蚁之家搜集整理于网络,
联系邮箱:mxgf168#qq.com(#改为@)