【发布时间】:2021-06-01 20:37:03
【问题描述】:
作为作业,我有一个听起来像这样的问题:
We have a n*n square matrix. It is called 'subdiagonal'
if all the elements above the main diagonal are null.
a) Copy the useful elements (the ones which are not null, so basically all the elements
from the main diagonal and below) to an array. (I've done that)
b) Write an algorithm which takes two subdiagonal matrix A, B as an input.
Those are transformed into arrays V_a and V_b with the algorithm from a),
then they calculate C = A*B only using only V_a and V_b
例如
Let's say A =
1 0 0 0 0
2 3 0 0 0
4 1 3 0 0
1 9 0 2 0
1 0 1 2 2
B =
2 0 0 0 0
1 1 0 0 0
0 1 2 0 0
1 1 2 3 0
2 0 0 1 2
after this input, V_a = 1,2,3,4,1,3,1,9,0,2,1,0,1,2,2; V_b = 2,1,1,0,1,2,1,1,2,3,2,0,0,1,2
and the product V_c will be 2,7,3,9,4,6,13,11,4,6,8,3,6,8,4
so the matrix will look like
2 0 0 0 0
7 3 0 0 0
9 4 6 0 0
13 11 4 6 0
8 3 6 8 4
这是我已经研究了一段时间的代码:
#include <iostream>
#include <algorithm>
void read(int& a, int**& matrix)
{
std::cin >> a;
matrix = new int*[a];
for (int i = 0; i < a; i++)
{
for (int j = 0; j < a; j++)
{
matrix[i] = new int[a];
}
}
for (int i = 0; i < a; i++)
{
for (int j = 0; j < a; j++)
{
std::cin >> matrix[i][j];
}
}
}
void showMatrix(int a, int** matrix)
{
for (int i = 0; i < a; i++)
{
for (int j = 0; j < a; j++)
{
std::cout << matrix[i][j] << " ";
}
std::cout << std::endl;
}
}
void showArray(int a, int* array)
{
for (int i = 0; i < a; i++)
{
std::cout << array[i] << " ";
}
}
void createArray(int a, int& arrayLength, int** matrix, int*& array)
{
int nrDeElemente = a*a - (a * (a - 1)) / 2;
array = new int[nrDeElemente+1];
arrayLength = 0;
for (int i = 0; i < a; i++)
{
for (int j = 0; j < i+1; j++)
{
array[arrayLength++] = matrix[i][j];
}
}
}
int* multiplyArrays(int a, int arrayLength, int* array1, int* array2)
{
int* array3 = new int[arrayLength + 1];
for (int i = 0; i < a; i++)
{
array3[i] = 0;
}
int t = 1;
for (int i = 0; i < arrayLength; ++i)
{
for (int j = 0; j < t; ++j)
{
for (int p = j; p < a; p++)
{
array3[i] += array1[j] * array2[p];
}
}
++t;
}
return array3;
}
int main()
{
int **matrix1, **matrix2;
int *array1, *array2, *multiplyResult;
int a, arrayLength;
read(a, matrix1);
read(a, matrix2);
createArray(a, arrayLength, matrix1, array1);
createArray(a, arrayLength, matrix2, array2);
multiplyResult = multiplyArrays(a, arrayLength, array1, array2);
showArray(arrayLength, multiplyResult);
}
我做了a),但我不知道怎么做b)
我想我在概念上理解它(经过数小时的试验),但我真的不知道如何实现它。
我需要 3 个 for 循环,例如:
->最外层的必须负责我们在新数组上计算的位置
->下一个必须从第二个数组中选择要相乘的元素。 (选择乘数)这是其中之一 我不知道如何实现的循环。当行(来自矩阵)结束时它必须以某种方式停止并从它停止的位置开始 + 1 个元素。
->最里面的必须选择乘法的第二项(被乘数)。 我也不知道我应该如何实现这个。它应该选择与乘数一样多的元素,而且循环很奇怪(因为我每次都需要从同一行中选择所有元素)。
谁能帮我解决b点并解释他们的想法?
我很挣扎,我真的觉得我需要帮助。
顺便说一句,multiplyArrays 中的 3 个 for 循环毫无意义,您可以只写其他东西来代替它们。这 3 个 for 循环基本上是我的程序唯一需要的东西(我认为)。
谢谢:)
【问题讨论】:
-
为了古怪,可以将“将有用的元素复制到数组中”解释为仍然不允许填充零,因此您仍然可以以一种简单的方式映射原始矩阵 :) 但是我认为,这不是任务的潜在意图......
-
我不是用英语学习的,所以我不得不翻译这个问题,这就是为什么它有点模棱两可。在我自己的语言中,它更像是“将矩阵的有用部分(有用 = 主对角线及其下方的元素)转换为数组)。
-
好的,所以 V_a 有第一行的 1 个项目,第二行的 2 个项目,第三行的 3 个项目,等等。所以每个循环都比上一次大一个。
-
@JerryJeremiah 是的
标签: c++ arrays algorithm matrix