- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个我制作的程序,它应该转置一个矩阵,无论它的大小是多少。然而,它并没有像预期的那样工作,我不知道为什么,我确实从它那里得到了输出,没有编译错误,但是 {1,2,3},{4,5,6} 的输出是 { 1,0,0},{0,0,4},这对我来说完全没有意义。我已经多次在纸上浏览“内存快照”,但就是找不到我遗漏的东西,此时我真的只需要另一双眼睛,谢谢。
#include "stdafx.h"
#include <fstream>
#include <iostream>
#include <iomanip>
#include <string>
#include <cmath>
#include <vector>
using namespace std;
void squaretranspose(int &M, int &MT, int ROWS, int COLS);
int main(void)
{
int M[2][3]={{1,2,3},{4,5,6}};
int MT[3][2]={0};
int ROWS(2),COLS(3);
int i,j;
cout << " The entries of the original matrix " << endl;
for(i=0;i<=ROWS-1;i++)
{
for(j=0;j<=COLS-1;j++)
{
cout<<M[i][j]<<"\t";
}
cout << endl;
}
squaretranspose(M[0][0],MT[0][0],ROWS,COLS);
cout << " The entries of the transposed non-square matrix " << endl;
for(i=0;i<=COLS-1;i++)
{
cout << endl;
for(j=0;j<=ROWS-1;j++)
{
cout<<MT[i][j]<<"\t";
}
}
system ("PAUSE");
return 0;
}
void squaretranspose (int &M, int &MT, int ROWS, int COLS)
{
// declare pointers to change the input matrice's values
int *ptr,*ptrT;
// declare indices for a row by row process
int i,j;
// declare placeholder 2d vectors for swapping the I,j, entries to ,j,i entries
vector < vector<int>> temp(ROWS,COLS);
vector < vector<int>> tempT(COLS,COLS);
vector < vector<int>> temp_T(ROWS,ROWS);
// set the pointers to point to the first entry of the input and output matrices
ptr = &M;
ptrT = &MT;
// if rows=cols we want to use 2d vector temp
if (ROWS=COLS)
{
// store all of the input matrice's values in the 2d vector "temp"
for(i=0;i<=ROWS-1;i++)
{
for(j=0;j<=COLS-1;j++)
{
// set the i,j th entry of the 2d vector "temp" equal to the value currently pointed to by the pointer
temp[i][j]=*ptr;
// increment the pointer to the address of the next entry of the input matrix unless we are on the last entry
if ((i!=ROWS-1)&&(j!=COLS-1))
{
ptr++;
}
}
}
}
// reset pointer address to first entry
ptr=&M;
// the for loop for swapping the j,i entries of the 2d vector "temp" with the i,j entries of the input matrix
for(i=0;i<=ROWS-1;i++)
{
for(j=0;j<=COLS-1;j++)
{
// if j is not equal to i swap the value pointed to by the pointer (the i,j entry of the input matrix) for the j,ith entries value of the 2d vector "temp"
if (j!=i)
{
*ptr=temp[j][i];
}
// increment the pointer if it is not on the last entry
if ((i!=ROWS-1)&&(j!=COLS-1))
{
ptr++;
}
}
}*/
// if ROWS<COLS we want to have 2d vector tempT
if (ROWS<COLS)
{
// store all of the input matrice's values in the 2d vector "tempT"
for(i=0;i<=ROWS-1;i++)
{
for(j=0;j<=COLS-1;j++)
{
// set the j,ith entry of the 2d vector "temp" equal to the value currently pointed to by the pointer
tempT[j][i]=*ptr;
// increment the pointer to the address of the next entry of the input matrix
if (((i!=(ROWS-1))&&(j!=(COLS-1))))
{
ptr++;
}
}
}
ptr=&M;
// transport the entries of tempT into the output matrix MT
for(i=0;i<=COLS-1;i++)
{
for(j=0;j<=ROWS-1;j++)
{
*ptrT=tempT[i][j];
// increment the pointer
if (((i!=ROWS-1)&&(j!=COLS-1)))
{
ptrT++;
}
}
}
}
ptrT=&MT;
// if ROWS>COLS we want to use the 2d vector temp_T
if (ROWS>COLS)
{
// store all of the input matrice's values in the 2d vector "temp_T"
for(i=0;i<=ROWS-1;i++)
{
for(j=0;j<=COLS-1;j++)
{
// set the j,i th entry of the 2d vector "temp" equal to the value currently pointed to by the pointer
temp_T[j][i]=*ptr;
// increment the pointer
if (((i!=ROWS-1)&&(j!=COLS-1)))
{
ptrT++;
}
}
// the for loop for swapping the j,i entries of the 2d vector "temp" with the i,j entries of the input matrix
for(i=0;i<=COLS-1;i++)
{
for(j=0;j<=ROWS-1;j++)
{
// if j is not equal to i swap the value pointed to by the pointer (the i,j entry of the input matrix) for the j,ith entries value of the 2d vector "temp"
if (j!=i)
{
*ptrT=temp_T[j][i];
}
// increment the pointer
if (((i!=ROWS-1)&&(j!=COLS-1)))
{
ptrT++;
}
}
}
}
return;
}
//就是这样,如果 COLS 非常小并且说 ROWS 非常大,因为中间的 2d 平方 vector ,它不是很有效,但对于其他一切它应该是相当好的,如果它工作正常。
最佳答案
您的代码有几个主要问题,这一行:
if (ROWS=COLS)
可能意味着:
if (ROWS == COLS)
第一种情况你将赋值为COLS
至 ROWS
在第二种情况下,您将检查它们是否相等。在你所有的for
你正在使用的循环 <=
什么时候应该使用 <
否则您将访问数组边界之外的一个。
除此之外,代码太复杂了,转置函数应该非常简单,这是一种可能的方法:
template <int n, int m>
void squaretranspose( int a[n][m], int b[m][n])
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
b[j][i] = a[i][j];
}
}
}
但是转置矩阵的最快和最简单的方法是反转坐标,而不是访问 (i,j)
你访问(j,i)
.另一方面,如果性能是您的主要关注点,那么这个 previous thread我的解决方案也很好地涵盖了这个主题,并且我的解决方案与其他可能适合您的解决方案一样。
关于c++ - 谁能帮我解决这个程序的问题(它使用指针转置矩阵),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17437218/
我刚接触 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 <<
我是一名优秀的程序员,十分优秀!