2013-06-07 3 views
0

Я пытаюсь преобразовать матрицу int [,]. Но я не получаю правильный вывод. Я сделал транспозицию с двумя циклами, но я думаю, что я сделал ошибку. Я просто не могу указать на это.Транспонирование матрицы не работает

Вот мой код:

int[,] matrix = new int[2,2]; 
matrix[0, 0] = 1; 
matrix[0, 1] = 2; 
matrix[1, 0] = 3; 
matrix[1, 1] = 4; 

public void transponieren() 
{ 
    int[,] temp = this.matrix; 

    for (int i = 0; i < this.matrix.GetLength(0); i++) 
    { 
     for (int j = 0; j < this.matrix.GetLength(1); j++) 
     { 
      this.matrix[i, j] = temp[j, i]; 
     } 
    } 

    transponiert = true; 
} 

С входом

[1, 2]
[3, 4]

я получаю выход

[ 1, 3]
[3, 4]

У меня уже есть другое решение, которое работает, но я хочу знать, что я сделал не так, поскольку я только скопировал рабочее решение из другого места.

+0

ваши значения настроек 'this.matrix' во время транспонирования, создайте копию – Sayse

+0

Что вы имеете в виду? temp [,] уже является копией матрицы, которая является атрибутом класса, содержащего метод транспонирования. – LeonidasFett

+0

см. Мой ответ, я не тестировал его, хотя – Sayse

ответ

3

Ваша проблема в том, что эта линия:

int[,] temp = this.matrix; 

делает не сделать новый массив. Поскольку int[,] является ссылочным типом, вы в итоге получаете temp, ссылаясь на this.matrix, поэтому любые изменения в одной из этих матриц повлияют на другую.

Ваша логика требует, чтобы temp фактически был отдельным массивом, поэтому он терпит неудачу.

Так что вам просто нужен новый массив нужного размера:

var temp = new int[this.matrix.GetLength(0),this.matrix.GetLength(1)]; 

Однако, обратите внимание, что создание массива временного подобные транспонировать квадратную матрицу очень неэффективно, так как вы можете сделать на месте транспонировать (но только если вы не возражаете уничтожить исходное содержимое).


[EDIT] Дополнительный образец: как на месте транспонировать квадратную матрицу.

public void TransposeSquareMatrixInPlace(int[,] matrix) 
{ 
    if (matrix == null) throw new ArgumentNullException("matrix"); 
    if (matrix.GetLength(0) != matrix.GetLength(1)) throw new ArgumentOutOfRangeException("matrix", "matrix is not square"); 

    int size = matrix.GetLength(0); 

    for (int n = 0; n < (size-1); ++n) 
    { 
     for (int m = n+1; m < size; ++m) 
     { 
      int temp = matrix[n, m]; 
      matrix[n, m] = matrix[m, n]; 
      matrix[m, n] = temp; 
     } 
    } 
} 
+0

ОК имеет смысл, я забыл об этом часть о ссылках и ценностях. спасибо, что напомнили всем. – LeonidasFett

+0

Значительно больше знаний всегда лучше, так что пожалуйста, скажите мне :) – LeonidasFett

+0

@LeonidasFett ok, я добавил пример кода, который переносит квадратную матрицу на место. –

1
int[,] temp = new int[this.matrix.GetLength(0),this.matrix.GetLength(1)]; 

for (int i = 0; i < this.matrix.GetLength(0); i++) 
{ 
    for (int j = 0; j < this.matrix.GetLength(1); j++) 
    { 
     temp[i, j] = this.matrix[i, j]; 
    } 
} 
this.matrix = temp 

transponiert = true; 
+0

Я все равно получаю тот же результат здесь ... – LeonidasFett

+0

Я отредактировал на основе Matthew Watsons, ответ – Sayse

+0

это тоже работает сейчас, спасибо кучу – LeonidasFett

1

INT [,] Темп = this.matrix;

Временная переменная содержит ссылку на матричную переменную. Следовательно, когда i = 0, матрица ввода изменяется.

1
public void Transposition(){ 
    MatRes = new int[Mat1.GetLength(1), Mat1.GetLength(0)]; 
    for (int i = 0; i < Mat1.GetLength(1); i++){ 
     for (int j = 0; j < Mat1.GetLength(0); j++){ 
      MatRes[i, j] = Mat1[j, i]; 
     } 
    } 
} 

Работает для каждого вида матрицы, считая Mat1 как матрицу транспонирования и MatRes транспонированной матрицы.