Все мы знаем, насколько полезна транспозиция матриц, и написать общий алгоритм для последовательного использования не составит труда. Однако у меня возникли некоторые проблемы с тем, чтобы сделать то же самое для многопоточных целей, и я получил только этот небольшой случай для правильной работы 4 x 4.
Мой подход заключается в назначении равных частей структуры double[][], в данном случае 2 x 2, каждому из четырех потоков. В данном случае это означает начальные позиции 0,0, 0,2, 2,0 и 2,2. Это передается с помощью «kol» и «rad».
Однако я не могу заставить это работать с большими матрицами, поэтому любая помощь будет оценена. Ближайший ответ на эту проблему, который я нашел, находится здесь: Как распараллелить транспонировать матрицу?
Это также вдохновило меня на разделение структуры double[][] на четыре части. Мой (рабочий) код 4 x 4 можно найти ниже, так как я могу изменить его для работы с четырьмя потоками?
Ваше здоровье!
public double[][] transponerMatrise(double[][] matrise, int rad, int
kol, int id)
{
if((id != 2))
{
for (int i = rad; i < n/2 + rad; i++)
{
for (int j = kol+1; j < n/2 + kol; j++)
{
System.out.println("Traad " + id + " bytter " + i + "," + j + " med " + j + "," + i);
System.out.println("Value is " + matrise[i][j] + ", " + matrise[j][i]);
element = matrise[i][j];
matrise[i][j] = matrise[j][i];
matrise[j][i] = element;
}
}
}
else
{
for (int i = rad; i < n/2 + rad-1; i++)
{
for (int j = kol; j < n/2 + kol; j++)
{
System.out.println("Traad " + id + " bytter " + i + "," + j + " med " + j + "," + i);
System.out.println("Value is " + matrise[i][j] + ", " + matrise[j][i]);
element = matrise[i][j];
matrise[i][j] = matrise[j][i];
matrise[j][i] = element;
}
}
}
return matrise;
}
PS: я знаю, что код работает правильно, потому что у меня есть метод проверки рабочего последовательного варианта.