c++中的for循环异步问题矩阵问题

欢迎加入我们,一同切磋技术 &
用户名: &&&
密 码: &
共有 2830 人关注过本帖
标题:求助:C++ for循环不能进行的原因
等 级:新手上路
&&问题点数:0&&回复次数:9&&&
求助:C++ for循环不能进行的原因
#include&iostream&
void main()
&&& int a[4][4]={
&&&&&&&&{1,2,3,4},
&&&&&&&&{5,2,8,4},
&&&&&&&&{1,9,3,7},
&&&&&&&&{5,7,9,2}
&&& int i=0,j,sum=0;
&&& cout&&&矩阵为:&&&
&&& for(;i&4;i++)
&&&&&&&&for(j=0;j&4;j++)
&&&&&&&&&&&&cout&&a[i][j]&&'\t';
&&&&&&&&cout&&
&&& };//此前为输出矩阵的代码,矩阵能顺利输出,没有错误
&&& int k=0,l=0;
&&& for(;k&4;k++)
&&&&&&&&for(;l&4;l++)
&&&&&&&&&&&&if(k==l)
&&&&&&&&&&&&sum=sum+a[k][l];
&&&&&&&&&&&&&&& };
&&&&&&&&&&&&};
&&& cout&&&k=&&&k&&
&&& cout&&&l=&&&l&&
&&& cout&&&正对角线值&&&sum&&
//将 k.l在括号里声明的时候,为什么循环就可以进行?
搜索更多相关主题的帖子:
等 级:新手上路
注:这个程序输出的对角线和值为1,本来应该是8的。我怀疑程序只进行了一次。
等 级:新手上路
我明白了,l=0应该放在括号里,否则就自增至3就再也变不回0了。
等 级:业余侠客
帖 子:103
专家分:280
嵌套循环的l在进入下一次循环时,没有初始化为0,所以值保持是4
[ 本帖最后由 naruto01 于
09:43 编辑 ]
等 级:版主
威 望:178
帖 子:3296
专家分:21133
内循环一次之后 l的值恒为4,也就是说,内循环只执行一次!
★★★★★为人民服务★★★★★
等 级:论坛游民
专家分:24
额,很明显啊,如果你k,l放在外面,首先是外层循环,k为0,l为0,然后执行内部循环,此时if判定为假,因此不执行sum赋值那句,然后执行的又是内部循环,k,l依然为0,相等(执行sum赋值)。这样内部循环执行,直到l变为4,此时跳出循环,而sum为1。然后,执行外部循环,k++,变为1,然后执行内部循环,注意!!!由于你的l放在外面,此时l已经为4,内部循环无法执行,直接跳出。然后再执行外部循环,内部循环再也无法执行了。&&&&&因此从头到尾,sum的赋值只进行过一次! 另外,for后面不需要加&;&
来 自:甘肃天水
等 级:侠之大者
帖 子:227
专家分:457
等 级:论坛游民
帖 子:12
专家分:32
应该把l=0放到内层循环里面,如果像你那样的话,就在k=0这次外层循环时;l=4后就回不去了!以后l恒等于4,;这程序你至少要把l=0放到循环里面!
等 级:论坛游民
帖 子:19
专家分:20
等 级:新手上路
帖 子:15
同意blme176!!!
版权所有,并保留所有权利。
Powered by , Processed in 0.110880 second(s), 7 queries.
Copyright&, BCCN.NET, All Rights ReservedC++里完成矩阵类的建立
暑假在学校无聊,就学了一些C++的东西.在学到C++用类来封装数据的时候,突然想到如果把我们常用的矩阵做成一个类,在类里实现一些矩阵运算的功能,岂不是很好?于是写了下面这些代码:
//~CMatrix.h
//programming by lei,
class CMatrix
&CMatrix(int,int);&&&&&&&&
//构造函数
&bool initialize(int,int);&
//矩阵初始化
create();&&&&&&&&&&&&
//由用户输入矩阵各元素
output();&&&&&&&&&&&&
//输出矩阵各元素
&CMatrix operator +(CMatrix
&M2);& //重载矩阵加运算
&CMatrix operator -(CMatrix
&M2);& //重载矩阵减运算
&CMatrix operator *(int
&m);&&&&&&
//重载矩阵与常数乘法运算
&&& CMatrix
operator *(CMatrix &M2); //重载矩阵与矩阵乘法运算
//矩阵行数
//矩阵列数
&double *m_pD&
//使用指针指向矩阵各元素
//构造函数
CMatrix::CMatrix(int r,int c)
& initialize(r,c);&
//矩阵初始化函数
bool CMatrix::initialize(int r,int c)
&& m_row=r;
&& m_col=c;
&& m_pData=new double[r*c];
&& for(int
i=0;i&m_row*m_i++)
m_pData[i]=0;
//输入矩阵数据元素,创建新矩阵
bool CMatrix::create()
& m_pData=new double[m_row*m_col];
& for(int i=0;i&m_row*m_i++)
cin&&m_pData[i];
//矩阵输出函数
void CMatrix::output()
&& int j=0;
&& for(int
i=0;i&m_row*m_i++)
cout&&m_pData[i]&&" ";
&& if(j==m_col)
{j=0;cout&&"\n";}
//重载矩阵相加运算
CMatrix CMatrix::operator +(CMatrix &M2)
&& CMatrix M=*
&& for(int
i=0;i&m_row*m_i++)
M.m_pData[i]=m_pData[i]+M2.m_pData[i];
&& return M;
//重载矩阵相减运算
CMatrix CMatrix::operator -(CMatrix &M2)
&& CMatrix M=*
&& for(int
i=0;i&m_row*m_i++)
M.m_pData[i]=m_pData[i]-M2.m_pData[i];
&& return M;
//重载矩阵与常数相乘运算
CMatrix CMatrix::operator *(int &m)
&& CMatrix M=*
&& for(int
i=0;i&m_row*m_i++)
M.m_pData[i]=m_pData[i]*m;
&& return M;
//重载矩阵与矩阵乘法运算
CMatrix CMatrix::operator *(CMatrix &M2)
&& CMatrix M=*
&& int j=0;
&& for(int
i=0;i&m_row*m_i++)
M.m_pData[i]=m_pData[i]*M2.m_pData[i+j*m_col];
&& if(j==M2.m_row) j=0;
&& return M2;
//**************
当然,我们还可以在此基础上再添加其他矩阵运算成员函数,以完善CMatrix类.
新建一个source文件,将CMatrix.h包含进去,即可使用矩阵类.
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。优化了一些算法
#pragma once
#include &iostream&
#include &iomanip&
#include &string&
#define OVERFLOWED 1E-12
class Matrix
Matrix(int m, int n);
//构建一个m*n的全零矩阵
Matrix(int n);
//构建一个n*n的单位矩阵
Matrix(const Matrix &);
//拷贝构造函数,深拷贝
Matrix(double* items, int m, int n);//根据数组拷贝一个矩阵
~Matrix();
static Matrix FromFile(std::string file);
int getRowNum() const;
//返回矩阵的行数
int getColNum() const;
//返回矩阵的列数
Matrix Trans() const;
//将矩阵转置
double get(int i, int j) const;
//返回矩阵第i行j列元素
void set(int i, int j, double val);
//设置矩阵第i行j列元素
Matrix operator +(const Matrix &m);
//两个矩阵相加
Matrix operator -(const Matrix &m);
//两个矩阵相减
Matrix operator *(const Matrix &m);
//两个矩阵相乘
Matrix operator *(const double f);
//矩阵乘以常数
Matrix& operator=(const Matrix& m);
Matrix Inverse();
friend std::ostream& operator &&(std::ostream &os, const Matrix &m);
//指向矩阵首元素
//矩阵行数
//矩阵列数
//矩阵初等行变换
//如果j=-1,则对i扩大multiply倍
//如果j在取值范围内,则将第i行扩大multiply倍加到j行
void RowSwap(int i, int j, double multiply);
//交换两行
void RowSwap(int i, int j);
void FlowOver();
#include "Matrix.h"
#include &vector&
#include &cmath&
#include &fstream&
#include &sstream&
using namespace
Matrix::Matrix(int m, int n)
if (m & <span style="color: # || n & <span style="color: #)
cout && "矩阵大小不能为负\n";
item = new double[m*n];
for (int i = <span style="color: #; i & m*n; i++)
item[i] = <span style="color: #;
//也可用二维数组初始化
Matrix::Matrix(double* items, int m, int n)
item = new double[m*n];
for (int i = <span style="color: #; i & colNum*rowN i++)
item[i] = items[i];
Matrix::Matrix(int n)
rowNum = colNum =
item = new double[n*n];
for (int i = <span style="color: #; i & i++)
for (int j = <span style="color: #; j & j++)
if (i == j)
set(i, j, <span style="color: #.0);
set(i, j, <span style="color: #);
Matrix::Matrix(const Matrix &M)
colNum = M.colN
rowNum = M.rowN
//这里不能对指针直接赋值,复制对求逆、转置等操作会影响原矩阵
item = new double[colNum*rowNum];
for (int i = <span style="color: #; i & colNum*rowN i++)
item[i] = M.item[i];
Matrix& Matrix::operator=(const Matrix & M)
colNum = M.colN
rowNum = M.rowN
if (item != nullptr) delete[]
item = new double[colNum*rowNum];
for (int i = <span style="color: #; i & colNum*rowN i++)
item[i] = M.item[i];
return *this;
Matrix Matrix::FromFile(std::string file)
ifstream read(file);
if (!read.is_open())
cout && "Matrix::未能打开文件\n";
int rows = <span style="color: #;
vector&double&
while (getline(read, line))
istringstream record(line);
double num = <span style="color: #.0;
while (record && num)
nums.push_back(num);
return Matrix(&(*nums.begin()), rows, nums.size() / rows);
Matrix::~Matrix()
double Matrix::get(int i, int j) const
return item[i*colNum + j];
void Matrix::set(int i, int j, double value)
item[i*colNum + j] =
void Matrix::RowSwap(int i, int j, double multiply)
if (j == -<span style="color: #)
for (int k = <span style="color: #; k & colN k++)
set(i, k, multiply*get(i, k));
for (int k = <span style="color: #; k & colN k++)
set(j, k, multiply*get(i, k) + get(j, k));
void Matrix::RowSwap(int i, int j)
Matrix _copy = *this;
for (int k = <span style="color: #; k & colN k++)
double swap = _copy.get(j, k);
set(j, k, _copy.get(i, k));
set(i, k, swap);
Matrix Matrix::Trans() const
Matrix _copy = *this;
_copy.rowNum = this-&colN
_copy.colNum = this-&rowN
for (int i = <span style="color: #; i & _copy.rowN i++)
for (int j = <span style="color: #; j & _copy.colN j++)
_copy.set(i, j, get(j, i));
int Matrix::getRowNum() const
return rowN
int Matrix::getColNum() const
return colN
ostream& operator &&(ostream &os, const Matrix &m)
for (int i = <span style="color: #; i & m.rowN i++)
for (int j = <span style="color: #; j & m.colN j++)
os && std::setw(<span style="color: #) && std::fixed && std::setprecision(<span style="color: #) && m.get(i, j) && " ";
os && "\n";
os.flush();
Matrix Matrix::operator +(const Matrix &m)
if (m.colNum != colNum || m.rowNum != rowNum) return *this;
Matrix _copy = *this;
for (int i = <span style="color: #; i & rowN i++)
for (int j = <span style="color: #; j & colN j++)
_copy.set(i, j, get(i, j) + m.get(i, j));
Matrix Matrix::operator -(const Matrix &m)
if (m.colNum != colNum || m.rowNum != rowNum) return *this;
Matrix _copy = *this;
for (int i = <span style="color: #; i & rowN i++)
for (int j = <span style="color: #; j & colN j++)
_copy.set(i, j, get(i, j) - m.get(i, j));
Matrix Matrix::operator *(const double f)
Matrix _copy = *this;
for (int i = <span style="color: #; i & rowN i++)
for (int j = <span style="color: #; j & colN j++)
_copy.set(i, j, get(i, j)*f);
Matrix Matrix::operator *(const Matrix &m)
if (colNum != m.rowNum)
cout && "无法相乘!";
return *this;
Matrix _copy(rowNum, m.getColNum());
for (int i = <span style="color: #; i & rowN i++)
for (int j = <span style="color: #; j & m.colN j++)
double sum = <span style="color: #;
for (int k = <span style="color: #; k & m.rowN k++)
sum += get(i, k)*m.get(k, j);
_copy.set(i, j, sum);
Matrix Matrix::Inverse()
Matrix _copy = *this;
//变换结果
Matrix result(colNum);
if (colNum != rowNum)
cout && "矩阵不可逆!" &&
return *this;
for (int i = <span style="color: #; i & rowN i++)
int MaxRow =
//首先找到第i列的绝对值最大的数,并将该行和第i行互换
double max = abs(_copy.get(i, i));
for (int j = j & colN j++)
if (abs(_copy.get(j, i))&max)
max = abs(_copy.get(j, i));
//交换j,i两行
if (MaxRow != i)
result.RowSwap(i, MaxRow);
_copy.RowSwap(i, MaxRow);
//将第i行做初等行变换,将第一个非0元素化为1
double r = <span style="color: #.0 / _copy.get(i, i);
_copy.RowSwap(i, -<span style="color: #, r);
result.RowSwap(i, -<span style="color: #, r);
for (int j = <span style="color: #; j & rowN j++)
if (j == i) continue;
r = -_copy.get(j, i);
_copy.RowSwap(i, j, r);
result.RowSwap(i, j, r);
//result.FlowOver();
void Matrix::FlowOver()
for (int i = <span style="color: #; i & rowNi++)
for (int j = <span style="color: #; j & colNj++)
if (abs(get(i, j)) &= OVERFLOWED) set(i, j, <span style="color: #);
阅读(...) 评论()当前位置:
&如何用c++来求解矩阵的相关问题。
如何用c++来求解矩阵的相关问题。
作者 yuxi1989
本科毕业论文是图像处理方面的。需要大量的矩阵运算。要用vc实现。
如何编程进行矩阵的运算呢?加减乘、求逆、特征值、特征向量等等。
用c语言的话,如果只用数组的话,我完全不敢想象。。。而且那些矩阵变换里面的交换行列什么的,感觉只有人脑才有那种悟性来做。
所以问一下大家这方面的思路。谢谢!
常用算法程序集
可以使用第三方的开源函数库,比如BLAS 与LAPACK,有C语言版本。
openCV里面也有关于矩阵的运算。
个人感觉矩阵问题还是交给matlab好
引用回帖:: Originally posted by cmdblock at
个人感觉矩阵问题还是交给matlab好 [1] CSparse
CSparse(稀疏矩阵计算的C语言代码库)是《Direct Methods for Sparse Linear Systems》一书配套的源码教程,是稀疏矩阵在数值计算中的代码的例程,内含matlab接口,在数据压缩存储,大规模稀疏线性系统求解,游戏建模等方面有广泛的应用,且代码简洁高效,便于阅读学习。
[2] 提高MATLAB中稀疏矩阵的计算速度,
引用回帖:: Originally posted by yalefield at
[1] CSparse
CSparse(稀疏矩阵计算的C语言代码库)是《Direct Methods for Sparse Linear Systems》一书配套的源码教程,是 ... 6楼能不能把链接中的文件放在这儿供我们下载呀,呵呵
24小时热帖
下载小木虫APP
与700万科研达人随时交流

我要回帖

更多关于 js for循环问题 的文章

 

随机推荐