关于网友提出的“ 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:
想试试来着,可以最近有点小忙,明后天要是不用熬夜的话,就用boost.thread实现一下试试。 赞一下强大的豆腐哥,话说我还真没看明白楼主的矩阵运算...(楼主,几百行的代码,行行好,排排版吧,~@~)。so,手上正好有个以前封装的矩阵运算,贴一下。
解决方案2:
#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){}
Matrixtranspose(){
int cnt = 0;
int dep = 0;
int wid = 0;
Matrixm;
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
Matrixoperator *(Matrix & m){
Matrixtmp;
Matrixm_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};
Matrixmatrix1(ia, ia+30);
matrix1.print();
Matrixmatrix2(ia, ia+24);
matrix2.print();
Matrixmatrix3 = (matrix1 * matrix2).transpose();
matrix3.print();
}
很不幸,C++中暂时还没有Java那样的标准线程库,也许,你应该先告诉大家,你用的是啥平台~