- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我的 C++ 作业有一个非常令人恼火的问题。
我们的任务是使用动态内存分配在 C++ 中执行矩阵乘法。在大多数情况下,该程序运行良好,但赋值运算符以及(可能)矩阵乘法似乎不起作用。
基本上,我的程序在运行时可以毫无问题地执行矩阵乘法,但是返回的 Matrix 对象似乎执行得不是很好!
这里是Matrix.h文件的相关代码
class Matrix
{
//Pointer matrix
int **matrix;
//height and width of the matrix
int height;
int width;
//declaring all public functions to be included in the Matrix object
public:
Matrix();
Matrix(int, int);
~Matrix();
void constructor(int, int);
void destruct();
int getHeight() const;
int getWidth() const;
int getElement(int, int) const;
void setElement(int, int, int);
int* getColumn(int) const;
void setColumn(int, int*);
int* getRow(int) const;
void setRow(int, int*);
void fillMatrix(int);
Matrix& operator=(const Matrix &m);
const Matrix operator+(const Matrix &m);
const Matrix operator-(const Matrix &m);
const Matrix operator*(const Matrix &m);
bool operator==(const Matrix &m);
bool operator!=(const Matrix &m);
};
Matrix::Matrix()
{
matrix = new int*[1];
}
Matrix::Matrix(int x, int y)
{
constructor(x,y);
}
Matrix::~Matrix()
{
destruct();
}
/**
This function contructs the matrix using given heights and widths
(for colums and rows) and then allocates the memory for this
object
*/
void Matrix::constructor (int matrixHeight, int matrixWidth)
{
height = matrixHeight;
width = matrixWidth;
matrix = new int *[matrixHeight];
for ( int i = 0; i < matrixHeight; i++)
{
matrix[i] = new int[matrixWidth];
}
//initialising all areas in array
for ( int i = 0; i < matrixHeight; i++)
{
for ( int j = 0; j < matrixWidth; j++)
{
matrix[i][j] = 1;
}
}
}
/**
This function is for freeing any assigned memory to a matrix
for its columns and rows
*/
void Matrix::destruct ()
{
for ( int i = 0 ; i < getHeight() ; i++ )
{
delete [] matrix[i];
}
delete [] matrix;
matrix = NULL;
}
那是第一节,这里是矩阵乘法
/**
This function overloads the times operator
*/
const Matrix Matrix::operator*(const Matrix &m)
{
if(getWidth() == m.getHeight())
{
//i cant remember which way to do matrix mult, and im intoxicated
//so heres a shitty implementation
Matrix matrixResult(getHeight(), m.getWidth());
int result = 0;
int *row;
int *column;
cout << "\n\n matrix mult \n\n";
for ( int i = 0 ; i < getHeight() ; i++ )
{
for ( int j = 0 ; j < m.getWidth() ; j++ )
{
result = 0;
row = getRow(i);
column = m.getColumn(j);
for( int k = 0; k < m.getHeight() ; k++ )
{
result = result + (row[k] * column[k]);
}
matrixResult.setElement(i, j, result);
}
cout << "\n";
}
for ( int i = 0 ; i < getHeight() ; i++ )
{
for ( int j = 0 ; j < m.getWidth() ; j++ )
{
cout << std::setw(10) << matrixResult.getElement(i,j);
}
cout << "\n";
}
return matrixResult;
}
cout << "Not correct size to be multiplied";
return *this;
}
这是等号(这是我认为我的错误所在):
/**
Overloading the equals operator to be of
type Matrix. This function changes all
values of the currently instantiated matrix
to those of the one passed in via parameter
*/
Matrix& Matrix::operator=(const Matrix &m)
{
//destroy previous matrix value array
destruct();
//Create a new array the same size as the matrix to be copied
constructor(m.getHeight(), m.getWidth());
//looping through the current array
cout << "\n\n beginning equals\n\n";
for ( int i = 0 ; i < getHeight() ; i++ )
{
for ( int j = 0 ; j < getWidth() ; j++ )
{
//changing current array's elements to
//those of the paramter array
cout << std::setw(10) << m.getElement(i,j);
setElement(i, j, m.getElement(i, j));
}
cout << "\n";
}
return *this;
}
众所周知,我是 C++ 的新手,不幸的是,我们的讲师似乎坚持不给我们任何关于 C++ 编码的实践类(class),这非常好:/
此外,这是一个合作伙伴的编程练习,如果代码不是 100% 符合标准,我们深表歉意,但其中一些不是我自己的!
谢谢!
编辑:按要求实现 getColumn。
/**
This function returns the items in a specified column
within the matrix. The values are returns as a 1 dimensional
array, which has been malloc'ed.
*/
int* Matrix::getColumn(int col) const
{
//using malloc to assign the memoru for the returned array
int* result = new int[height];
//check to ensure column was within matrix range
if (col < width )
{
for( int i = 0 ; i < height ; i++ )
{
result[i] = getElement(i, col);
}
}
return result;
}
编辑 2:命令行输出。请注意我正在使用 GCC 通过 CODE::BLOCKS 在 WINDOWS 上编译和运行它
913 918 -418
676 736 -25
-225 265 -382
890 -739 -452 87
-331 -564 -761 280
-375 -895 101 709
829 -661 742 442
679 567 377 -322
-356 -136 -614 -356
matrix mult
665462 -818349 -1153492 40109
367399 -892293 -868173 247167
-144715 358705 -138547 -216213
beginning equals
197792 20092813134236931095717471
200928 199968 2003201701603654
-144715 358705 -138547 -216213
Process returned 0 (0x0) execution time : 0.009 s
Press any key to continue.
最佳答案
更改为 void Matrix::operator=(const Matrix &m){ ....} 并删除“return *this”
关于C++矩阵乘法返回数组第一行和最后两行的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13777515/
我刚接触 C 语言几周,所以对它还很陌生。 我见过这样的事情 * (variable-name) = -* (variable-name) 在讲义中,但它到底会做什么?它会否定所指向的值吗? 最佳答案
我有一个指向内存地址的void 指针。然后,我做 int 指针 = void 指针 float 指针 = void 指针 然后,取消引用它们以获取值。 { int x = 25; vo
我正在与计算机控制的泵进行一些串行端口通信,我用来通信的 createfile 函数需要将 com 端口名称解析为 wchar_t 指针。 我也在使用 QT 创建一个表单并获取 com 端口名称作为
#include "stdio.h" #include "malloc.h" int main() { char*x=(char*)malloc(1024); *(x+2)=3; --
#include #include main() { int an_int; void *void_pointer = &an_int; double *double_ptr = void
对于每个时间步长,我都有一个二维矩阵 a[ix][iz],ix 从 0 到 nx-1 和 iz 从 0 到 nz-1。 为了组装所有时间步长的矩阵,我定义了一个长度为 nx*nz*nt 的 3D 指针
我有一个函数,它接受一个指向 char ** 的指针并用字符串填充它(我猜是一个字符串数组)。 *list_of_strings* 在函数内部分配内存。 char * *list_of_strings
我试图了解当涉及到字符和字符串时,内存分配是如何工作的。 我知道声明的数组的名称就像指向数组第一个元素的指针,但该数组将驻留在内存的堆栈中。 另一方面,当我们想要使用内存堆时,我们使用 malloc,
我有一个 C 语言的 .DLL 文件。该 DLL 中所有函数所需的主要结构具有以下形式。 typedef struct { char *snsAccessID; char *
我得到了以下数组: let arr = [ { children: [ { children: [], current: tru
#include int main(void) { int i; int *ptr = (int *) malloc(5 * sizeof(int)); for (i=0;
我正在编写一个程序,它接受一个三位数整数并将其分成两个整数。 224 将变为 220 和 4。 114 将变为 110 和 4。 基本上,您可以使用模数来完成。我写了我认为应该工作的东西,编译器一直说
好吧,我对 C++ 很陌生,我确定这个问题已经在某个地方得到了回答,而且也很简单,但我似乎找不到答案.... 我有一个自定义数组类,我将其用作练习来尝试了解其工作原理,其定义如下: 标题: class
1) this 指针与其他指针有何不同?据我了解,指针指向堆中的内存。如果有指向它们的指针,这是否意味着对象总是在堆中构造? 2)我们可以在 move 构造函数或 move 赋值中窃取this指针吗?
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: C : pointer to struct in the struct definition 在我的初学者类
我有两个指向指针的结构指针 typedef struct Square { ... ... }Square; Square **s1; //Representing 2D array of say,
变量在内存中是如何定位的?我有这个代码 int w=1; int x=1; int y=1; int z=1; int main(int argc, char** argv) { printf
#include #include main() { char *q[]={"black","white","red"}; printf("%s",*q+3); getch()
我在“C”类中有以下函数 class C { template void Func1(int x); template void Func2(int x); }; template void
我在64位linux下使用c++,编译器(g++)也是64位的。当我打印某个变量的地址时,例如一个整数,它应该打印一个 64 位整数,但实际上它打印了一个 48 位整数。 int i; cout <<
我是一名优秀的程序员,十分优秀!