嗨我正在帮我的一个朋友编写一个程序,它将两个上三角矩阵相乘而不扩展矩阵。当我说没有扩展矩阵时,我的意思是没有用零填充上三角矩阵的下部(目标是节省空间)。我正在从一个文件中读取矩阵,该文件只有矩阵的上三角值,而下部则省略。
我想要完成的是编写一个给定数组和一对索引的函数,它将返回一个扩展矩阵在该位置具有的元素(0表示低于对角线,而值高于对角线) )。我正在考虑使用通常的矩阵乘法算法,该算法在需要访问元素时使用此函数。我已经研究了几个小时了,我无法想出一种方法将双矩阵索引(i,j)(我沿着行)转换为单个数组索引,反之亦然(正如提醒我一样) m使用单维数组存储上三角矩阵)。任何帮助将不胜感激!
答案 0 :(得分:0)
// mat is an array containing the upper triangle data for a square matrix of size n
// returns element at (i,j), or 0 for the lower triangle
int getFromTriangle(const int* mat, int n, int i, int j)
{
if (i > j) {
return 0; // lower triangle
} else {
return mat[j + (i*n) - i*(i+1)/2];
}
}
if
子句负责下三角。 else
子句计算数组索引,如下所示:
j + (i*n) - i*(i+1)/2
这只是常规的矩形矩阵索引函数减去一个恰好是i
triangular number的偏移量,因为在任何行i
中,存储已省略triangle(i)
} elements。
答案 1 :(得分:0)
您可以将算法划分为更小,易于理解的块。
// Get the array index given the rank, the row, and the column.
int getArrayIndex(int rank, int row, int col)
{
return (row*rank + col - col*(col+1)/2);
}
// Get the term of a matrix, given the rank, the row, and the column.
int getMatrixTerm(int a[], int rank, int row, int col)
{
if ( col < row )
{
return 0;
}
else
{
return a[getArrayIndex(rank, row, col)];
}
}
// Get the term for a row and column resulting from mulitiplication.
int getMultipliedTerm(int a[], int b[], int rank, int row, int col)
{
int term = 0;
int k = 0;
for ( ; k < rank; ++k )
{
term += getMatrixTerm(a, rank, row, k)*getMatrixTerm(b, rank, k, col);
}
return term;
}
// Set the term in c given the rank, the row, and the column.
void setMultipliedTerm(int a[], int b[], int c[], int rank, int row, int col)
{
if ( j >= i )
{
c[getArrayIndex(rank, i, j)] = getMultipliedTerm(a, b, rank, i, j);
}
}
// High level function to multiply two upper triangular matrices
// The lower part of the matrix is not stored at all.
void multiply(int a[], int b[], int c[], int rank)
{
int i = 0;
int j = 0;
for ( i = 0; i < rank; ++i )
{
for ( j = 0; j < rank; ++j )
{
setMultipliedTerm(a, b, c, rank, i, j);
}
}
}
答案 2 :(得分:0)
如果p =&amp; a [0] [0]则a [i] [j]与c ++中的*(p + i * row_size + j)相同。 其中p是指向与矩阵元素相同类型数据的指针。 我希望这是你想要的,你知道指针。 一切顺利。